2011-06-10 5 views
0

일반적인 요구 사항이 있다고 느껴지 긴하지만 적절한 방법으로 작동하지 못합니다. 나는 현재 프로젝트 A에서 컨트롤러의 생성자로 서비스 클래스 (싱글 톤 범위 내)를 주입하기 위해 Ninject를 사용하는 표준 MVC3 사이트를 가지고있다. 이것은 모두 정상적으로 작동한다.Ninject를 사용하여 클래스에 삽입하기 (ASP MVC3 내)

나는 프로젝트 A의 클래스를 필요로하는 또 다른 클래스 라이브러리를 가지고있다. 내가하고 싶은 것은 프로젝트 B 클래스의 MVC 프로젝트에서 사용하는 것과 동일한 싱글 톤 인스턴스를 삽입하는 것이다. 이것이 가능한가?

현재 global.asax에 바인딩 설정에 대한 정보가 있습니다. 내 컨트롤러 내에서

private void SetupDependencyInjection() 
     { 
      // Create Ninject DI kernel 
      IKernel kernel = new StandardKernel(); 

      kernel.Bind<IRepositoryA>().As<RepositoryA>().InSingletonScope(); 
      // A load more binding go here... 

      // Tell ASP.NET MVC 3 to use our Ninject DI Container 
      DependencyResolver.SetResolver(new NinjectResolver(kernel)); 
     } 

,이

public class Class1 
{ 
public Class1(IRepositoryA iRepositoryA, more params...) 
{ 
    var class2 = new Class2(iRepositoryA, more params...); 
} 
} 

public class Class2 
{ 
    public Class2(IRepositoryA iRepositoryA, more params...) 
    { 
    // Something goes here.... 
    } 
} 

처럼 내가 ProjectB에 두 개의 클래스가

public ExampleController(IRepositoryA iRepositoryA, more params....) 
     { 
      this.iRepositoryA= iRepositoryA; 
      var ProjectB.Class1 = new ProjectB.Class1(this.iRepositoryA); 
      // more setup of params here.... 
     } 

처럼 뭔가 내가 뭘 찾고 있어요 것은 새로운 인스턴스를 인스턴스화되어 있습니다 iClass (잠재적으로 더 많은로드)를 매개 변수로 전달하지 않고도 ProjectB.Class1을 사용할 수 있습니다. 글로벌 asax에서 IKernel을 노출하고 iKernel.Get()과 같은 작업을 수행 할 수 있다고 생각합니다. 이것이 최선의 방법인가요? 다른 문제는 컨트롤러에 주입 된 매개 변수가 3 단계 이상 떨어질 수 있다는 것입니다. 위의 예제와 유사하지만 Class2에만 해당됩니다. 이 경우 체인에서 매개 변수를 계속 전달하는 것이 가장 좋습니다.

+2

이 더 잘하지 않을까요 AuditController가 ProjectB.Class1 인 경우 직접 인스턴스가 전달 되었습니까? – alexn

+0

죄송합니다, 당신은 나의 모범에서 결함을 지적했습니다 - 나는 기뻐할 것입니다. – user460667

+0

그 방법에 대한 힌트가 필요합니까? – alexn

답변

4

당신의 컨트롤러는 Class1 인스턴스가 아닌 IRepositoryA을 필요로하기 때문에 솔루션은 컨트롤러의 생성자에서 Class1 예를 필요로하는 것입니다

public ExampleController(Class1 class1) { 
    this.class1 = class1; 
} 

// Let Ninject provide these dependencies! 
public Class1(IRepositoryA repositoryA, Dependency2 dependency2) { 
    this.repositoyA = classB; 
    this.dependency2 = dependency2; 
} 

을 (그리고 Dependency Injection Myth: Reference Passing 참조)

+0

Ninject는 설정에 지정할 때까지 모든 레벨이 내려가는 매개 변수를 처리합니다 – BlackTigerX

관련 문제