2011-02-02 8 views
11

짧게 요약하면 ELMAH를 MVC 2 및 Ninject와 함께 사용하려고하므로 매개 변수없는 생성자를 사용해야합니다. 여기에 대한 초기 게시물을 작성했습니다 : Using a parameterless controller constructor with Ninject?생성자 주입 대신 속성 주입 사용

생성자 주입 대신 속성 주입을 사용하는 것이 좋습니다. 내가 DepartmentsRepository 또는 _departmentsRepository에 액세스하려고 여부를

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
     get { return _departmentsRepository; } 
     set { _departmentsRepository = value; } 
    } 

    ... 
} 

하지만 내 다른 컨트롤러 기능에

가, 내가 인스턴스로 설정하지 않은 객체 참조를 얻을이에

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository departmentsRepository; 

    public DepartmentsController(IDepartmentsRepository departmentsRepository) 
    { 
     this.departmentsRepository = departmentsRepository; 
    } 

    ... 
} 

: 그래서 나는이에서 이동 액세스하려고하면 개체 오류가 발생합니다.

내가 여기서해야 할 다른 것이 있습니까?

+6

당신은'Ninject.Web.Mvc'을 사용하고 있습니까? –

+2

기다려주세요. 매개 변수없는 생성자를 사용해야하는 이유는 무엇입니까? – jfar

+0

속성에 특정 이름이있을 때 특정 종속성이 해결되지 않는 이상한 문제가 있습니다. 이름을 바꾸면 제대로 작동하지만 다른 모든 종속성은 정상적으로 처리됩니다 (동일한 속성 이름의 다른 경우에는 동일한 종속성이 정상적으로 해결됩니다). 왜 그런 단서가 없지만 항상 시도해 볼만한 것이 있습니다. –

답변

2

개체 참조가 예외로 설정되지 않은 이유는 두 가지가 있습니다.

DepartmentsRepository의 구체적인 구현에 IDepartmentsRepository 바인딩하는 방법을 알고하지 않습니다 (내가 그 그래도 경우) 의심

1) Ninject에

2) 컨트롤러의 생성자에서 DepartmentsRepository 속성에 액세스하려는 경우, 그것은 것입니다 예외를 throw합니다 (Ninject는 객체가 생성 된 후에 만 ​​Property Dependencies를 삽입 할 수 있기 때문에).

희망이 있습니다.

10

비슷한 문제가있었습니다. 내 질문을보십시오 : Using Ninject with Membership.Provider. 당신이 DepartmentsController을 초기화 할 때

은 기본적으로 당신은 당신의 Ninject에 커널 인에 this (즉, 당신의 부서 컨트롤러를 주입 할 필요가 그래서 같은 그 뭔가 :..

NinjectHelper이 경우 현재 Ninject에 커널을 얻을 수
public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
    get { return _departmentsRepository; } 
    set { _departmentsRepository = value; } 
    } 

    public DepartmentsController() 
    { 
    NinjectHelper.Kernel.Inject(this); 
    } 
} 

+6

이 작업은 가능하지만 제어기가 Ninject에 대해 알 필요가 없도록 ControllerFactory를 사용하여 주입하는 것이 더 좋습니다. –

3

Global.asax.cs

 protected void Application_Start() 
     { 
      DependencyResolver.SetResolver(
       new MyDependencyResolver(
        new StandardKernel(
         new MyModule()))); 
      //... 
     } 
:

이 같은 시도

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver 
    { 
     private IKernel kernel; 

     public MyDependencyResolver(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 
    } 

MyModule.cs

public class MyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IDepartmentsRepository>().To<DepartmentsRepository>(); 
     } 
    } 
+0

어떻게 도움이되는 질문입니까? –

+1

@dave 이것은 '객체의 인스턴스로 설정되지 않은 객체 참조'문제를 해결할 수 있습니다 ... Ninject.Web.Mvc는 시도하지 않았습니다. – frennky

0

위의 댓글이 게시 다니엘 T., 당신은 Ninject.Web.Mvc을 확인해야한다. 해당 프로젝트에서 NinjectHttpApplication을 사용하면 모든 것을 자동으로 실행하므로 NinjectControllerFactory가 새 컨트롤러를 구성 할 때 속성 주입을 채우기 위해 Inject()를 호출합니다.