1

this 질문을 바탕으로 ioc-container를 사용할 때 런타임 매개 변수로 새 객체를 초기화하는 방법은 Abstract Factory를 만드는 것입니다. 를 구축하기봉인 된 클래스에 대한 Abstract Factory의 대안이 있습니까?

internal sealed class AssetsDownloadingProcess 
{ 
    private readonly IBackgroundWorker _backgroundWorker; 
    private readonly IAssetsStorage _assetsStorage; 
    private readonly Parameters _parameters; 

    public AssetsDownloadingProcess(IBackgroundWorker backgroundWorker, 
     IAssetsStorage assetsStorage, Parameters parameters) 
    { 
     _parameters = parameters.Clone(); 

     _backgroundWorker = backgroundWorker; 
     _assetsStorage = assetsStorage; 
    } 
} 

그리고 공장 : 내 예에서

,이 클래스가 당신이 볼 수있는

internal sealed class AssetsDownloadingProcessFactory 
{ 
    private readonly IBackgroundWorker _backgroundWorker; 
    private readonly IAssetsStorage _assetsStorage; 

    public AssetsDownloadingProcessFactory(IBackgroundWorker backgroundWorker, 
     IAssetsStorage assetsStorage) 
    { 
     _backgroundWorker = backgroundWorker; 
     _assetsStorage = assetsStorage; 
    } 

    public AssetsDownloadingProcess CreateProcess(
     AssetsDownloadingProcess.Parameters parameters) 
    { 
     return new AssetsDownloadingProcess(
      _backgroundWorker, _assetsStorage, parameters); 
    } 
} 

AssetsDownloadingProcess 어떤 인터페이스를 구현하지 않습니다 교체되지 않습니다 다른 클래스와. 따라서이 팩토리는 쓸데없는 코드 일뿐입니다. AssetsDownloadingProcessFactory 생성자를 위해 완전히 생략 할 수 있습니다. 그러나, 나는 의존성 주입을 생성자에 사용할 수 없다.

공장 만들기와 쓸데없는 코드 생성의 번거 로움없이 내 IoC 컨테이너에서 Injection의 이점을 사용하고 싶습니다. 이 작업을 수행하는 올바른 방법은 무엇입니까? 뭔가 빠졌거나 DI 잘못 사용하고 있습니까?

답변

1

일반적으로 here과 같이 런타임 데이터를 사용하여 응용 프로그램 구성 요소를 만들고 초기화하지 않도록해야합니다. 런타임 데이터가 생성자를 통해 전달된다는 단순한 사실만으로도 사용자는 팩토리를 생성해야합니다. 의 API 메소드 호출을 통해

  • 통과 런타임 데이터 :

    성분으로 런타임 데이터를 주입하는 문제 the article 주어진 용액

    런타임 데이터는 방법 중 하나에 의해 초기화 된 객체 그래프 통화를 통해 흐를 수 있도록하는 것이다 또는
  • 은 런타임 데이터를 확인할 수있는 특정 추상화에서 런타임 데이터를 검색합니다.

오브젝트 그래프 작성 중에 런타임 데이터가 사용되지 않으면 구성 루트에 DI를 사용하여 구성 요소를 작성할 수 있으므로 문제가 사라집니다.

이렇게하는 것이 항상 가능한 것은 아니며, 그렇지 않은 경우 추상 팩토리가 해결책입니다.

그러나 Object Composition은 응용 프로그램의 Composition Root에서만 발생하므로 추상 팩터 리 은 추상화 인 추상화 여야합니다. 이 방법으로 만 구성 폴더에 AssetsDownloadingProcess 구성 요소가 생성되는 것을 방지 할 수 있습니다.

  1. 이 공장의 소비자가 살고있는 애플리케이션 계층에서 추상화, 즉 IAssetsDownloadingProcessFactory을 정의

    이 작업을 수행하는 방법은하는 것입니다.

  2. 컴포지션 루트 내에이 추상화의 구현을 만듭니다. 추상화를 사용하지

소비자 콘크리트 AssetsDownloadingProcessFactory 클래스에 대한 종속성이 걸릴 (a Dependency Inversion Principle violation 임)과는 조성 루트에서 오브젝트 조성물 당긴다 것을 의미한다. 이로 인해 응용 프로그램 전체에 개체 구성이 흩어져 유지 관리가 어려워집니다.

관련 문제