2016-11-01 5 views
0

저는 ABCProcessor, PQRProcessor와 같은 여러 구현을 갖는 IProcessor라는 인터페이스가 하나 있습니다. 외부 매개 변수를 기반으로 특정 프로세서를 사용하고 싶습니다. StructureMap을 사용하여 어떻게 동일한 작업을 수행 할 수 있습니까?StructureMap - 조건부 클래스를 입력하십시오.

나는 동일한 이름의 인스턴스를보고있다.

+0

"외부 매개 변수"란 무엇입니까? – Steven

+0

외부 매개 변수는 프로세서 선택을 결정하는 구성 키와 같습니다. – Anup

+0

값이 일정 할 때는 조건부가 필요하지 않습니다. 구성 값은 응용 프로그램 수명 동안 변경되지 않으므로 해당 값을 기준으로 sreucturemap을 무조건 구성 할 수 있습니다. – Steven

답변

0

당신은 공장 패턴을 사용할 수 있습니다

public interface IProcessorFactory 
{ 
    IProcessor Create(int dropDownValue); 
} 

public class ProcessorFactory : IProcessorFactory 
{ 
    private readonly IContainer _container; 
    public ProcessorFactory(IContainer container) 
    { 
     _container = container; 
    } 

    public IProcessor Create() 
    { 
     if(//your condition) 
      return _container.GetInstance<ABCProcessor>(); 

     _container.GetInstance<PQRProcessor>(); 
    } 
} 

(또는 단순히 요구 대신 컨테이너의 의존성 주입) 다음 등을 간단하게

private readonly IProcessorFactory _processorFactory; 

public MvcController(IProcessorFactory processorFactory) 
{ 
    _processorFactory = processorFactory; 
} 

public void Method() 
{ 
    var processor = _processorFactory.Create(); 
} 
0

문제에 대한 가장 좋은 해결책은 숨기는 것입니다 IProcessor :

01에 대한 프록시 구현을 구현하여 여러 구현의 존재와 소비자 간의 선택에 대한 지식
public sealed ProxyProcessor : IProcessor 
{ 
    private readonly ABCProcessor abc; 
    private readonly PQRProcessor pqr; 
    private readonly IProcessorConfig config; 

    public ProxyProcessor(ABCProcessor abc, PQRProcessor pqr, IProcessorConfig config) { 
     this.abc = abc; 
     this.pqr = pqr; 
     this.config = config; 
    } 

    // Implement IProcessor methods to forward to the CurrentProcessor. 
    public void Process() => CurrentProcessor.Process(); 

    private IProcessor CurrentProcessor => config.ProcessorType == "ABC" ? abc : pqr; 
} 

이렇게하면 런타임에 올바른 구현으로 위임 할 수 있습니다. 고객은 런타임에 결정할 때이라는 사실을 알지 못합니다. 이제 소비자에게 ABCProcessor 또는 PQRProcessor 중 하나를 주입하는 대신 ProxyProcessor을 소비자에게 주입합니다.

  • 그것은을 가진 방지 :이 솔루션은 같은 공장의 사용에 비해 몇 가지 장점을 가지고

    IProcessor processor = 
        new ProxyProcessor(
         abc: new ABCProcessor(), 
         pqr: new PQRProcessor(), 
         config: new SqlProcessorConfig("constr")); 
    

    참고 : 예를 들어, 이것은 ProxyProcessor의 객체 그래프의 모양 수있는 방법입니다 소비자를 변화시킨다. 소비자들은 잊혀지지 않습니다.

  • 불필요한 복잡성을 소비자에게 도입하는 것을 방지합니다. 공장 접근 방식으로 소비자는 추가 의존성을 처리해야합니다. 이것은 코드와 테스트를 복잡하게합니다.
  • 개체 그래프가 지연된 방식으로 생성되어 개체 그래프의 확인이 복잡해집니다.

팩토리가 올바른 추상화가 아닌 이유에 대해 자세히 알고 싶다면 this article을 읽어보십시오.