2012-02-05 3 views
1

현재 2 개 또는 3 개의 다른 클래스를 호출 할 수있는 다른 클래스를 호출 할 수있는 주 클래스가 있습니다. 메인 클래스는 윈도우 폼을 만들 수도 있습니다. 인터페이스 종속성 계층

그래서 순간에 우리가있을 수 있습니다 :

public class MainClass 
{ 
    ... 
    AnotherClass = new AnotherClass(); 
    fmMain myForm = new fmMain(); 
} 

public class AnotherClass 
{ 
    ... 
    DatabaseClass dbClass = new DatabaseClass(); 
    FileClass fClass = new FileClass(); 
} 

나는 리팩토링 후 내가 IOC 컨테이너를 사용할 수 있습니다 생성자 인터페이스 종속성에 넣어, 그것을 볼 수있다.

문제는 내 진입 점이 주 클래스이므로 기본 클래스 생성자에서 모든 종속성을 갖고 다른 클래스와 폼에 종속 관계를 전달한다는 것입니다.

이 문제는 매우 복잡해질 수 있으며 주 클래스는 대부분 다른 클래스에서 사용 된 10 개의 종속성을 가질 수 있습니다. 대안이 있습니까?

답변

2

종속성은 필요한 위치에 로컬로 정의해야합니다. 즉, 종속성을 유형의 생성자에 정의한 다음 IoC 컨테이너를 사용하여 모든 유형을 해결해야합니다. 이런 식으로 IoC는 "이들을 다른 클래스와 형식으로 전달"합니다. IoC 컨테이너를 사용할 때는 가능하면 "new"를 사용하지 말고 대신 컨테이너를 사용하여 인스턴스를 만듭니다. 그것은 당신을 위해 의존성의 생성과 삽입을 처리 할 것입니다.

예를 들어 (Ninject 사용) 다음은 자체 종속성을 정의하는 Form을 보여줍니다. 컨테이너는 모든 종속성을 공급하고 주입하며 으로 재귀 적으로 사용하여 ProductForm의 인스턴스를 확인합니다.

종속성을 진입 점 클래스에 삽입 할 필요는 없지만 모듈의 바인딩으로 지정되고 Forms과 같은 유형이 해결 될 때 컨테이너에 의해 주입됩니다.

public class Program 
{ 
    public Program() 
    { 
     IKernel kernel = new StandardKernel(new MainModule()); 

     Form form = kernel.Get<ProductForm>(); 

     form.Show(); 
    } 
} 

public class MainModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ProductForm>().ToSelf(); 
     Bind<IProductService>().To<ProductService>(); 
     Bind<IProductDb>().To<IProductDb>(); 
    } 
} 

internal class ProductForm : Form 
{ 
    private readonly IProductService _productService; 

    public ProductForm(IProductService productService) 
    { 
     _productService = productService; 
    } 
} 

internal interface IProductService {} 

internal class ProductService : IProductService 
{ 
    private readonly IProductDb _productDb; 

    public ProductService(IProductDb productDb) 
    { 
     _productDb = productDb; 
    } 
} 

internal interface IProductDb {} 

internal class ProductDb : IProductDb {} 
5

IoC 컨테이너에서이를 수행하도록하십시오.

종속성으로 AnotherClass을 등록한 다음 컨테이너 인스턴스를 직접 참조하여 해결하십시오.

0

메인 클래스는 Composition Root입니다. 괜찮습니다. 일 경우 지저분해질 수 없습니다. 이것은 단일 책임이어야합니다. 즉, 응용 프로그램 시작점은 Humble Object이어야합니다.

+0

이 경우 플러그인 루트가 아닙니다. – Jon

관련 문제