0

저는 한동안 IoC 컨테이너로 Unity를 사용하고 있었고 반복적 인 문제에 대한 올바른 해결책을 찾을 수 없었습니다.Unity - 컨텍스트에 따라 올바른 인스턴스 해결

public IAuditOperationLogWriter Create(Operation operation) 
{ 
    switch (operation) 
    { 
     case Operation.Insert: 
      return UnityContainer.Resolve<AuditInsertLogWriter>(); 
     case Operation.Update: 
      return UnityContainer.Resolve<AuditUpdateLogWriter>(); 
     default: 
      break; 
    } 
} 

것은 그 인스턴스가 있기 때문에 자신의 종속성으로 만들 복잡 것입니다 : 당신이 울부 짖는 볼 수 있듯이 나는 동작 인수에 따라 (그들은 IAuditOperationLogWriter 인터페이스를 구현) AuditInsertLogWriter 및 AuditUpdateLogWriter의 일부 인스턴스를 작성해야합니다. 또한이 팩토리에서 Unity와의 종속성을 제거하려고합니다. 그래서, 내 질문입니다 : 어떻게 달성 할 수있는 유니티 올바른 문맥에 따라 만들려면 올바른 형식을 해결할?

+1

정말 문제의 일반적인 유형이 무엇인지에 대한 일반적인 대답은 여기를 참조하십시오 : http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created- via-a-di-container/1945023 # 1945023 –

답변

3

컨테이너에서 팩토리의 종속성을 제거하려면 모든 종속성을 미리 연결해야합니다.

우아한 방법은 Unity가 자동 공장을 지원하는 것입니다.

public class AuditOperationLogWriterFactory 
{ 
    private Dictionary<Operation, Func<IAuditOperationLogWriter>> auditCreator = 
     new Dictionary<Operation, Func<IAuditOperationLogWriter>>(); 

    public AuditOperationLogWriterFactory(Func<AuditInsertLogWriter> insert, 
     Func<AuditUpdateLogWriter> update) 
    { 
     auditCreator[Operation.Insert] = insert; 
     auditCreator[Operation.Update] = update; 
    } 

    public IAuditOperationLogWriter Create(Operation operation) 
    { 
     if (auditCreator.ContainsKey(operation)) 
     { 
      return auditCreator[operation](); 
     } 

     return null; 
    } 
} 

을 그리고 당신은 단지 공장을 해결할 수 있으며, 유니티는 종속성을 묶을해야하며, 객체 생성이 (상황에 따라) 런타임까지 연기된다

이처럼 공장을 정의 할 수 있습니다. 복잡한 경우 구성 (설정 파일, 코드 또는 속성)을 통해 도움을 받아야 할 수 있습니다.

IUnityContainer container = new UnityContainer(); 

var factory = container.Resolve<AuditOperationLogWriterFactory>(); 

var logWriter = factory.Create(Operation.Insert); 
+0

나는 당신의 아이디어가 더 좋아 보이지만 비슷한 접근법을 택했습니다. 나는 이것을 아직 시도하지 않았다. 나는 그것을 최대한 빨리 할 것이다. 그래서 일할 수 있는지는 모르겠지만 투표 해 주셔서 감사합니다. – lontivero

+0

좋은 해결책. 나는 사전을 떨어 뜨릴 것이다. 오직 두 가지 선택만으로는 당신에게 어떤 성과도 안겨줄 것입니다. 간단한 스위치 또는 if-then-else는 적어도 빠릅니다. –

+0

@SebastianWeber : 귀하의 의견에 동의합니다. I [이전] (http://stackoverflow.com/revisions/8599174/1)에는 if-then-else가 있었지만이를 변경했습니다. 여기서 성능에 대해 걱정하지 않았지만 새로운 유형을 추가하려는 경우 if 또는 switch 문을 변경할 필요가 없습니다. –

0

작업 이름과 같은 등록 이름을 사용하여 유형을 등록 할 수 있습니다. 해결할 때 적절한 이름을 사용하면 적절한 등록을 받게됩니다.

UnityContainer의 등록 및 해결 방법 목록을 오버로드하고 'name'매개 변수가있는 항목을 찾습니다. 그것이 당신이 찾고있는 것입니다.

+1

이것은 유효한 접근법이지만 내 공장 클래스의 컨테이너에 대한 참조를 갖고 싶지 않습니다. – lontivero

관련 문제