2011-11-11 2 views
3

우리는 의존성 주입을하기 위해 MVC3 프로젝트에서 Ninject를 사용하고 있습니다. Ninject 및 Ninject.MVC3 패키지에 패키지 참조를 추가하기 위해 NuGet을 사용했습니다.MVC3의 종속물 주입 - 컨트롤러 외부

public static class NinjectMVC3 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule)); 
     DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     RegisterServices(kernel); 
     return kernel; 
    } 

    private static void RegisterServices(IKernel kernel) 
    {   
     kernel.Bind<IPrincipal>().ToMethod(c => HttpContext.Current.User); 
    } 
} 

는 지금까지 내 컨트롤러에 의존성을 해결하기 위해 큰 일을했습니다 : 내가 이런 짓을하면 내 App_Start 폴더에 NinjectMVC3 클래스를 생성

public class HomeController : Controller { 
    protected IPrincipal principal { get; set; } 

    public HomeController(IPrincipal principal) { 
     this.principal = principal; 
    } 
} 

이 컨트롤러는 IPrincipal에 대한 종속성이있는 I 내 부트 스트 래퍼 클래스에서 HttpContext.Current.User로 확인하도록 설정했습니다. 나는 컨트롤러가 아닌 IPrincipal에 종속성이 다른 클래스가 :

public class NonControllerClass 
{ 
    protected IPrincipal Principal { get; set; } 

    public NonControllerClass(IPrincipal principal) { 
    } 
} 

내가이 종속성을 해결하는 방법에 대한 갈 것이라고 어떻게? 생성자의 매개 변수가 아닌 경우 어떻게해야합니까? }

답변

3

글쎄, 이상적으로 이것은 결코 문제가되지 않을 것입니다. 모든 의존성은 컨트롤러에 적용되어야하며 의존성에 의존하는 의존성은 자동으로 주입되어야한다.

MVC에서 (거의) 모든 것이 컨트롤러에서 시작됩니다. 그래서 당신이있을 수 있습니다 서비스가 컨트롤러에 주입하기 때문에 당신은 아무것도 할 필요가 없습니다 방법

public class HomeController : Controller { 
    protected IMyService myService { get; set; } 

    public HomeController(IMyService myService) { 
     this.myService = myService; 
    } 
} 

public class MyService { 
    protected IPrincipal principal; 

    public MyService(IPrincipal principal) { this.principal = principal) 
} 

공지 사항, 서비스가 자동으로 올바른 의존성 주입됩니다.

그러나 동적으로 개체를 만들어야 할 수도 있습니다. 이 경우 MVC DependencyResolver를 사용할 수 있습니다.

var principal = DependencyResolver.Current.GetService<IPrincipal>(); 

그러나 절대적으로 필요한 경우가 아니면 반 패턴 (서비스 위치라고도 함)으로 간주되므로이 작업을 수행하지 마십시오. 때로는 많은 선택의 여지가 없습니다.

생성자 삽입을 사용하지 않으려면 속성 주입을 사용할 수 있습니다.

public class MyService { 
    [Inject] 
    public IPrincipal principal {get; set;} 
} 
+0

'DependencyResolver'와 관련해서는 ASP.NET MVC 전용 솔루션입니다. (괜찮습니다) OP가 순수한 Ninject에서 동일한 기능을 수행하기를 원한다면, 호출 할 때 새로운 인스턴스를 인스턴스화 할 팩토리 함수를 반환하기 위해'Func '을 간단히 주입 할 수 있습니다. –

+0

컨트롤러 액션의 속성에 뭔가가 필요합니다. 어떻게 주입합니까? – Dismissile

+1

@Dismissile - MVC에서 매개 변수 삽입을 사용하지 않는다고 생각합니다. 사용자 정의 액션 호출자를 생성하는 것과 같은 일을해야 할 것입니다. http://codeclimber.net.nz/archive/2009/02/10/how-to-use-ninject-to-inject-dependencies-into-asp.net-mvc.aspx보기 좋지 않습니다. 나는 이것을 반대하는 것이 좋습니다. –

관련 문제