문제

나는 완벽한 초보자를 ninject

나는 당 떨어져 다른 사람의 코드고 여러 인스턴스의 nInject 모듈은 클래스에서 파생되는 Ninject.모듈을 사용합니다.모듈이드 방법이 포함된 그들의 대부분의 코드입니다.

이러한 클래스에 따라 그리스도인이라 불리는 호출 LoadModule 방법의 인스턴스의 StandardKernel 및 전달의 인스턴스 모듈은 클래스입니다.

어쩌면 나는 뭔가가 분명하지만,여기의 혜택은 무엇인가 이상이 만들어 보통 오래된 클래스고 호출하는 방법,또는 아마 정적 등으로 정적 방법?

 

도움이 되었습니까?

해결책

이 Ninject 모듈은 사용되는 도구를 등록한 다양한 유형으로 IoC 컨테이너입니다.장점은 이러한 모듈은 다음 유지에서 자신의 클래스입니다.이것은 당신을 넣어 다양한 계층/서비스에서는 자신의 모듈을 사용합니다.

// some method early in your app's life cycle
public Kernel BuildKernel()
{
    var modules = new INinjectModule[] 
    {
        new LinqToSqlDataContextModule(), // just my L2S binding
        new WebModule(),
        new EventRegistrationModule()
    };
    return new StandardKernel(modules);
}

// in LinqToSqlDataContextModule.cs
public class LinqToSqlDataContextModule : NinjectModule
{
    public override void Load()
    {
        Bind<IRepository>().To<LinqToSqlRepository>();
    }
}

여러 모듈을 허용한 분리의 관심에도 내에서 당신의 IoC 컨테이너입니다.

당신의 나머지 부분은 질문이 소리 같이 그것에 대해 더 IoC 및 디 전체적으로,그리고 단지 Ninject.그렇다,사용할 수 있는 정적 객체를 구성하는 단지 모든 것에 대해 IoC 컨테이너 않습니다.IoC 컨테이너가는 정말 좋은 여러 개 있는 경우에는 계층의 종속성입니다.

public interface IInterfaceA {}
public interface IInterfaceB {}
public interface IInterfaceC {}

public class ClassA : IInterfaceA {}

public class ClassB : IInterfaceB
{
    public ClassB(IInterfaceA a){}
}

public class ClassC : IInterfaceC
{
    public ClassC(IInterfaceB b){}
}

건물 ClassC 통 이 시점에서,여러 깊이의 인터페이스가 있습니다.그것은 훨씬 쉽게 단지에게 묻는 커널에 대한 IInterfaceC.

var newc = ApplicationScope.Kernel.Get<IInterfaceC>();

다른 팁

어쩌면 나는 여기서 명백한 것을 놓치고 있을지 모르지만, 단지 평범한 오래된 클래스를 만들고 그 방법을 호출하거나 정적 방법을 가진 정적 클래스를 부르는 것보다 이것의 이점은 무엇입니까?

예, 당신은 그냥 전화를 걸 수 있습니다 Bind<X>().To<Z>() 모듈없이 바인딩을 설정하는 진술.

차이점은이 진술을 모듈에 넣으면 다음과 같습니다.

  • IKernel.Load(IEnumerable<Assembly>) 반사를 통해 이러한 모듈을 동적으로 발견하고로드 할 수 있습니다.
  • 바인딩은 논리적으로 이름으로 함께 그룹화됩니다. 이 이름을 사용하여 다시 언로드 할 수 있습니다. IKernel.Unload(string)

어쩌면 나는 뭔가가 분명하지만,여기의 혜택은 무엇인가 이상이 만들어 보통 오래된 클래스고 호출하는 방법,또는 아마 정적 등으로 정적 방법?

우리를 위해,그것은 기능을 추가 테스트에 나중에 시간이 매우 쉽습니다.그냥 무시 몇 가지는 바인딩을 가진 mockobjects 봐라.....레거시 코드가 없는 디는 유선"모든"까지,그것은 거의 불가능하여 시작을 삽입 테스트 사례가 없는 일부 재작업을 줄입니다.디에고 한 그 제대로 사용되는 디 유선 모두,그것은 매우 간단하게 이렇게도에 레거시 코드를 수 있는 매우다.

에서는 많은 디 프레임워크 사용할 수 있는 생산을 모듈에 대한 테스트로 테스트는 모듈을 재정의 특정한 바인딩을 가진 mockobjects(의 나머지 부분에 배선을 위).이러한 시스템을 테스트보다는 더 단위 테스트,하지만 내가 선호하는 경향이 있어요 더 높은 수준의 테스트보다는 평균자 테스트 간의 통합 클래스고 그것은 훌륭한 문서 누군가를 위해 프로젝트 참고 볼 수 있는 전체 기능 작업(대만 부품의 기능)하지 않고 설치하는 전체 시스템).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top