2

최근 MVC 3과 Ninject 2로 옮겼습니다. 대부분의 코드에서 생성자 삽입을 사용하지만, Inject 속성을 사용해야하는 곳이 있습니다. Ninject 2는 자신의 IDepencyResolver 인터페이스를 등록합니다. 가있을 때 그 기능은 이제 MVC 정말 엄격하게 관련 아니지만, 때문에 나는NInject 및 MVC 3 - [Inject] 속성 대신 DependencyResolver를 사용해야합니까?

public SomeClass 
{ 
    public IUserService UserService { get; set; } 

    public SomeClass() 
    { 
     UserService = DependencyResolver.Current.GetService<IUserService>(); 

대신

public SomeClass 
{ 
    [Inject] 
    public IUserService UserService { get; set; } 
할 수있는, System.Web.Mvc 네임 스페이스의 일부가되는 DependencyResolver 클래스를 좋아하지 않는다

그래서 내 클래스에 Ninject 네임 스페이스를 참조 할 필요가 없습니다. DependencyResolver을 그렇게 사용해야합니까?

답변

5

클래스의 올바른 작동에 필요하지 않은 종속성에 대해서만 속성 주입을 사용하지만 사용자가 설정 한 경우 일부 기능을 추가 할 수 있습니다. 이러한 기능의 예는 로깅입니다. 따라서 사용자가 자신의 구현을 제공 할 수있는 로거를 나타내는 속성을 가질 수 있으며 클래스가 정상적으로 작동하지만 계속 로그하지 않으면 간단히 수행 할 수 있습니다.

다른 모든 경우에는 생성자 주입을 사용합니다. 이렇게하면 소비자에게이 클래스가 다른 서비스에 대한 의존성이 있음을 나타냅니다.

public SomeClass 
{ 
    public IUserService UserService { get; set; } 

    public void SomeMethodWhichDoesntEnforceUserService() 
    { 
     if (UserService != null) 
     { 
      // Provide some additional functionality 
     } 
    } 
} 

및 클래스는 사용자의 서비스없이 제대로 작동 할 수없는 경우 : 두 경우에 따라서

public SomeClass 
{ 
    private readonly IUserService _userService; 
    public SomeClass(IUserService userService) 
    { 
     _userService = userService; 
    } 

    public void SomeMethodWhichRequiresTheService() 
    { 
     _userService.DoSomething(); 
    } 
} 

없이 참조

그래서 단순히이 나는 것 속성 주입에 대한 귀하의 질문에 대답하기 DI 세부 사항까지 이것이 Inversion of Control이 의미하는 것입니다.

+0

그리고 BaseClass가 예를 들어 생성자에 3 개의 인터페이스가 삽입되어 있고 InheritedClass에 추가가있는 경우에는 무엇을합니까? 2. 5 개의 매개 변수로 생성자를 만드십니까? – LukLed

+0

@ LukLed, 네,하지만 일반적으로 의존성의 수를 줄이려고합니다. 5 꽤 큰 것 같습니다.그것은 당신의 수업이 너무 많은 일을하고 있다는 것을 의미하며 아마 그것을 다른 수업으로 나누는 것을 고려해야합니다. –

+0

너무 많습니까? IPrincipal이 주입되고, IRepository가 주입되고, IApplicationCache가 BaseClass에 주입됩니다. 이것들은 모든 서비스에 사용되는 기본 항목입니다. 나는 직접적으로 참조하는 대신 가능한 한 많이 주입하려고 노력한다. 그것은 생성자에서 많은 매개 변수를 만듭니다. 좋습니다, 나는 집합 서비스로 그것을 취급 할 수있다. – LukLed

1

SomeClassIUserService의 생성자 주입을 수행 할 수없는 이유는 무엇입니까? 디자인에 문제가 있음을 나타낼 수 있습니다.

DependencyResolver을 직접 참조하지 않으려면 DI 프레임 워크에서 서비스 로케이터의 추상화를 구현할 수 있습니다. CommonServiceLocator이지만, this question에 대한 답은 DI를 올바르게 수행 할 때 그러한 추상화가 필요하지 않아야 함을 나타냅니다. 대신 응용 프로그램의 디자인을 조정해야합니다.

+0

'DependencyResolver'는'DI' 라이브러리에 대한 추상화입니다. 이 클래스는 Ninject와 관련이 없습니다. 모든 상속 클래스의 생성자에 매개 변수를 추가하고 싶지 않기 때문에 기본 클래스에서'Inject' 속성을 사용하고 있습니다. 또한 순환 참조 문제가있었습니다. – LukLed

+0

아, 내가 ninject에 익숙하지 않지만 자동 생성자 삽입은 ninject 참조로 코드를 오염시키는 데 관심이 있다면 옵션이 아닙니까? http://kohari.org/2008/06/08/attributes-we-dont-need-no-stinkin-attributes/ –

+0

생성자 삽입은 옵션이지만 거대한 생성자를 갖고 싶지는 않습니다. 승인. 나는 생각할 것이별로 없을 때 너무 많은 생각을 할 것입니다. – LukLed

0

mvc3 용 ninject.web.mvc 버전이 필터 속성에 생성자 삽입을 지원한다고 생각합니다. 너 해봤 어?

+0

심지어 가능합니까? 필요한 모든 생성자 매개 변수를 지정하지 않으면 코드가 컴파일되지 않습니다. – LukLed

+0

@LukLed 시도 할 시간이 없었지만 가능한 것처럼 보입니다 ... https : //github.com/ninject/ninject.web.mvc/tree/master/mvc3/src/SampleApplication/Controllers/ FilterInjectionExamples는 일반 속성을 필터 속성을 삽입하는 마커로 사용하고있는 것 같습니다. – dotjoe

+0

복잡한 똥 U는 필터 속성에 대한 DI를 수행해야합니다 .... : | –

관련 문제