2012-07-31 2 views
1

나는 이런 식으로 뭔가를 할 수 있도록 내 도메인 내에서 정적 클래스 내 컨테이너에 대한 참조를 얻기 위해 노력하고 있어요 :정적 클래스에 IUnityContainer에 대한 참조를 얻는 것은

public static class DomainEvents 
{ 
    public static IUnityContainer Container { get; set; } 

    // ... 

    public static void Do<T>(T args) where T : IMyInterface 
    { 
     foreach (var s in Container.ResolveAll<IDoSomething<T>>()) 
      s.DoSomething(args); 
    } 
} 

나는 분명히 생성자를 통해 주입 할 수 , 내가 등록을 해결할 수 있도록 처리 할 수있는 다른 방법이 있습니까? 일부 문서를 읽는 것은 실제로 도움이되지 못했습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

왜 당신이 정적 클래스해야합니까? IoC를 사용하는 경우 일반 클래스로 만들고 필요한 곳에 주입하는 것이 쉬워야합니다. – millimoose

+0

@millimoose : DomainEvents' 클래스는 아마도 도메인 기반 디자인 컨텍스트의 엔티티에 의해 호출되며 엔티티에서 생성자 삽입을 수행 할 수 없거나 할 수 없습니다. 정적 클래스를 참조하는 대신 엔티티 메소드에 IDomainEvents 인터페이스를 삽입하는 것이 좋습니다 (메소드 삽입 사용). – Steven

+0

@Steven이 경우조차도 다음과 같은 것을 할 것입니다 : http://rogeralsing.com/2009/05/30/entity-framework-4-entity-dependency-injection/ (사용중인 ORM 가정 초기 엔티티 라이프 사이클에 충분히 접근 할 수 있습니다.) – millimoose

답변

2

왜 함수를 매개 변수로 컨테이너를 전달하지 않습니까? 또는 더 나은 방법은 확장 메서드에 대한 좋은 후보자처럼 보입니다. 아래와 같이 함수 헤더를 변경하면 컨테이너에서 직접 Do를 호출 할 수 있어야합니다. 즉 : container.Do (args);

public static void Do<T>(this IUnityContainer container, T args) where T : IMyInterface 
{ 
    foreach (var s in container.ResolveAll<IDoSomething<T>>()) 
     s.DoSomething(args); 
} 
+0

고마워요. 확장 메서드 같은 건 내가 뭘했는지입니다. 이것 좀 봐. – stephenl

0

아마도 도메인 기반 디자인을 연습하고이 정적 DomainEvents 클래스를 엔티티의 메서드 내에서 참조하십시오. 유감스럽게도 유니티 컨테이너 테스트를 구성해야하므로 엔티티 테스트가 훨씬 어려워집니다.

대신 엔티티 메소드에 메소드 삽입을 사용하고 IDomainEvents 인터페이스를 필요한 메소드에 삽입하십시오. 방법 주입은 종종 최적의 하위 있지만, 개체를 처리 할 때 생성자와 속성 주입은 그림에서, 그러나 방법 주입 코드가 느슨하게 결합되어야 가능 :

public class Order 
{ 
    public void CancelOrder(IDomainEvents de) 
    { 
     ... 
    } 
} 
관련 문제