2011-03-05 3 views
2

저는 Ninject를 처음 사용하기 때문에 노력하고 있지 않을 수도 있습니다.하지만 물어보고 싶었습니다. 나는 자유로이 아래에 오타가있을 수 있습니다.개체 이니셜 라이저 및 LINQ가있는 Ninject

public interface IPerson 
{ 
    string FirstName { get; set; } 
    string LastName { get; set;} 

    string GetFullName(); 
} 

그리고 콘크리트 :

:

내가이 일을하는 데있어 무엇
public class Person : IPerson 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public string GetFullName() 
    { 
     return String.Concat(FirstName, " ", LastName); 
    } 
} 

내가 배열이나 XML에서 데이터를 검색하고있을 때이 같은 것입니다의 내가 인터페이스를 가지고 있다고 가정 해 봅시다

public IEnumerable<IPerson> GetPeople(string xml) 
{ 
    XElement persons = XElement.Parse(xml); 

    IEnumerable<IPerson> people = (
     from person in persons.Descendants("person") 
     select new Person 
     { 
      FirstName = person.Attribute("FName").Value, 
      LastName = person.Attribute("LName").Value 
     }).ToList(); 

    return people; 
} 

저는이 방법으로 콘크리트를 인터페이스에 단단히 묶고 싶지 않습니다. 개체에 대한 LINQ 또는 개체 이니셜 라이저를 사용하여 Ninject를 사용하는 것과 관련된 정보를 찾을 수 없었습니다. 나는 틀린 장소에서보고 있을지도 모른다. 그러나 나는 전혀 운이없는 날을 찾고 있었다.

필자는 커널을 싱글 톤 인스턴스에 넣고 작동하는지 확인하려고했지만, 커널을 넘기는 것이 좋지 않다는 말을 들었습니다. 저는 이것을 현재 클래스 라이브러리에 구현하려고합니다. 이것이 가능하지 않은 경우 누구에게도이 사례에서 모범 사례가 무엇인지에 대한 예나 제안이 있습니까? 도움에 미리 감사드립니다.

편집 : 몇 가지 답변을 바탕으로 분명히해야한다고 생각합니다. 예, 위의 예는 수명이 짧지 만 간단히 말해서 내가하려는 중 하나의 예입니다. 더 큰 그림을 그려 봅시다. XML 대신 제 3 자 웹 서비스를 통해 모든 데이터를 수집하고 그것에 대한 인터페이스를 만들고 있습니다. 데이터는 wsdl의 정의 된 객체이거나 XML 문자열 일 수 있습니다. IPerson은 Person 객체와 User 객체 모두에 사용될 수 있습니다. 나는 이식 할 필요가 있고 다른 프로젝트에서 사용될 것이고 MVC3 웹 애플리케이션에 그것을 전달할 것이고 객체가 자바 스크립트에서도 사용될 것이기 때문에 이것을 별도의 클래스 라이브러리 내부에서 할 것이다. 지금까지 모든 의견을 고맙게 생각합니다.

+0

업데이트에 대해서는 인터페이스가 필요하다고 생각하지 않습니다. 편집에 설명하는 경우 서비스에서 반환 된 객체를 새로운'Person' 객체로 변환하는 방법을 알고있는 타사 웹 서비스에 대한 추상화가 필요합니다. 'Person'은 단순히 POCO 도메인 객체이며 일반적으로 응용 프로그램 전체에서 다시 사용됩니다. – Steven

답변

3

Person 클래스는 수명이 짧은 개체이며 종속성 삽입에 사용하기에 적합하지 않습니다. 이 외에도 모든 동작을 포함하지 않고 단순히 POCO (일반 오래된 CLR 개체)입니다. POCO는 추출 할 가치가있는 것에 의존하지 않기 때문에 대개 추상화 할 이유가 없습니다. 다른 말로하면 : 주어진 예를 든다. IPerson 인터페이스가 필요하지 않습니다.신청 전반에 걸쳐 Person 클래스로 직접 작업 할 수 있습니다.

그러나 GetPeople 메서드는 일반적으로 DI 구성을 사용하여 추상화 할 서비스의 일부가 될 수 있습니다. 그러나 GetPeople(string xml) 메서드를 포함하는 서비스 인터페이스는 잘못된 추상화입니다. 이는 항상 XML 문자열을 제공하기 때문입니다. 이 XML 문자열이있을 때 다른 방식으로 XML 문자열을 구문 분석 할 이유가 있습니까? GetAllPeople() 메소드를 사용하는 IPersonRepository 인터페이스를 갖는 것이 더 편리 할 것입니다. 주어진 구현은 사람 (디스크, 데이터베이스 또는 누가 무엇을 알고 있는지)을 가져 오기 위해 XML 데이터 소스를 사용하는 XmlPersonRepository 일 수 있습니다.

+0

스티븐 모든 입력 주셔서 감사합니다, 나는 그 사용을 오해하고 있었고, 나는 이것을 멀리 옮겼습니다. 지금은 공장을 위해 그리고 적절한 곳에 약간의 부동산 주입을 위해 사용하고 있습니다. –

+0

@Alexander : 환영합니다. – Steven

2

IPerson 인터페이스의 구현이 두 개 이상입니까? (나는 의심 스럽지만 Person은 단순히 전달되는 데이터 객체입니다.) 아마도 귀하의 질문이 누락되었지만 DI는 관심사를 분리하고 인터페이스 디자인에서 구현을 추상화하기위한 것입니다.

DI가 정의 된 XML 스키마에서 Person 개체를 추출하는 데 어떻게 도움이되는지는 알지 못합니다. 구현을 동적으로 주입하지 않고 데이터를 파싱합니다. 아마도 XML을 다른 방법으로 구문 분석하여 성능을 비교하려는 경우 GetPeople이 포함 된 클래스의 대체 구현을 만들지 만, 질문의 요점으로는 볼 수 없습니다.

1

모든 개인은 당신에게 당신을 위해 IPerson의 구현을 제공 할 수 있습니다. 그것은 XML이나 다른 구조를 구문 분석하지 않습니다. 실제로 ninject 커널이나 서비스 위치 지정자를 거쳐야하므로 객체 초기화 구문을 잃을 가능성이 큽니다.

나는 당신이하고 싶은 것을위한 직렬화 라이브러리를 제안 할 것이다. json.net 또는 .NET's built in XML serialization을 추천합니다

+0

ryber, 제안 주셔서 감사하지만 XML을 구문 분석하기 위해 Ninject를 찾고있는 것이 아니라 Person을 선택하는 대신 Person에 종속성을 제공하기 위해 찾고 있습니다. –

0

일반적으로 20k + 담당자가있는 사람은 내가이 물건에 대해하는 것보다 더 많이 알고 있다고 가정합니다.

1) 귀하의 예는 '이'특정 예는 좋은 문제에없는 경우에도 너무 멀리 제거 Ninject에 웹 사이트
2)에 사용되는 예에서 아닙니다 그러나, 또한 나에게 보인다 손이 객체 이니셜 라이저를 사용하고 있으며 더 많은 합법적 인 시나리오에 적용 할 수 있습니다.

불행히도 Ninject를 사용하여 개체 초기화를 수행하는 방법에 대한 답변이 없지만 Ninject를 사용하여 '어디에서 도움이 될지'에 대한 제안이 있습니다. (이 게시물이 1 년이지만 어쩌면 누군가를 도울 것입니다.)

GetPeople() 메서드에서 구체적인 클래스를 사용하는 것이 가장 가능성이 높다는 것은 동의합니다. 그 방법은 아마도 Person에 고유하고 (동일한 어셈블리 및/또는 네임 스페이스에있을 가능성이있는) 구현에 속하기 때문입니다. 그러나 사용자에 대해 사용자에게 정보를 제공하는 양식과 같은 것이 있으면 구체적인 구현보다는 IPerson을 사용해야한다고 생각해야합니다.

linq를 사용하기 위해 주로 객체 초기화 도구를 사용해야하는 곳은 GetPeople과 같은 메소드에 있지만 구체적인 클래스로 작업해야합니다. 그래서 두 가지 모두를 최상으로 유지할 수 있어야합니다. 세계. 아니, 당신은 IPerson과 함께 작업 할 때 폼에 객체 이니셜 라이저를 사용할 수 없을 것입니다. 그러나 필자는 linq을 사용하려는 경우에 그렇게 할 필요가 없을 것이라고 생각하지 않습니다. GetPeople 메서드.

편집 : 사실 당신은 '필요'개체 이니셜 라이저는 몇 가지 문법 설탕을 지내다 경우 다시 작성할 수 있습니다

LINQ 여기에 사용하지 않는

IEnumerable<IPerson> people = ( 
    from person in persons.Descendants("person") 
    select new Person 
    { 
     FirstName = person.Attribute("FName").Value, 
     LastName = person.Attribute("LName").Value 
    }).ToList(); 

IEnumerable<IPerson> people = 
    (persons.Descendants("person") 
      .Select(o => 
      { 
       var p = new Person(); 
       p.FirstName = person.Attribute("FName").Value; 
       p.LastName = person.Attribute("LName").Value; 
       return p; 
      }).ToList(); 

으로 그리고 주입과 함께 작동하도록 수정 될 수있는 방법을 알 수 있습니다.