0

간단한 인터페이스를 통해 복잡한 기능을 제공하는 라이브러리의 외관이 있습니다. 내 질문은 외관에 사용 된 내부 유형에 대한 종속성 삽입을 수행하는 방법입니다.Unity 1.2 내부 유형의 종속성 삽입

public class XYZfacade:IFacade 
{ 
    [Dependency] 
    internal IType1 type1 
    { 
     get; 
     set; 
    } 
    [Dependency] 
    internal IType2 type2 
    { 
     get; 
     set; 
    } 
    public string SomeFunction() 
    { 
     return type1.someString(); 
    } 
} 

internal class TypeA 
{ 
.... 
} 
internal class TypeB 
{ 
.... 
} 

그리고 내 웹 사이트 코드 같은 것입니다 - -

여기
IUnityContainer container = new UnityContainer(); 
container.RegisterType<IType1, TypeA>(); 
container.RegisterType<IType2, TypeB>(); 
container.RegisterType<IFacade, XYZFacade>(); 
... 
... 
IFacade facade = container.Resolve<IFacade>(); 

facade.SomeFunction()을 예외로 인해 facade.type1을 던져 null가 facade.type2이다의 내 C# 라이브러리 코드의 모습을 가정 해 봅시다. 어떤 도움을 주셔서 감사합니다.

답변

2

컨테이너 생성 코드가 내부 유형 어셈블리 외부에있는 경우 Unity는이를 볼 수 없으므로 종속성을 주입 할 수 없습니다.

+0

하지만 [assembly : InternalsVisibleTo ("Microsoft.Practices.Unity")]를 설정하면 안됩니다. – Qvin

+0

Microsoft.Practices.Unity가 호출 어셈블리가 아니므로 컨테이너 작성이 의심 스럽습니다. – Femaref

3

내부 클래스 삽입은 권장되지 않습니다. factoryClass- 설정 클래스와 것

public class FactoryClass 
{ 
    public IType1 FirstDependency 
    { 
    get 
    { 
     return new Type1(); 
    } 
    } 

    public IType2 SecondDependency 
    { 
    get 
    { 
     return new Type2(); 
    } 
    } 
} 

그리고 XYZFacade에 의존 :

나는 내부 구현은 그 유형을 인스턴스화하는 데 사용 할 수있는 선언 된 어셈블리의 공공 팩토리 클래스를 만들 것

public class XYZfacade:IFacade 
{ 
    [Dependency] 
    public FactoryClass Factory 
    { 
     get; 
     set; 
    } 
} 

테스트 할 수있게하려면 FactoryClass에 대한 인터페이스를 생성하십시오.

+0

그렇다면 IType1과 Type1 모두 public일까요? 라이브러리 외부에 노출하고 싶지 않으면 어떻게합니까? 내부를 유지하면서도 의존성 주입을 수행하는 방법이 없습니까? – Qvin

+0

그런 경우 FactoryClass 내부에서 속성을 만들 수 있습니다. 나는 InternalsVisibleTo를 사용하는 것을 진지하게 고려할 것이고, 그것을 사용하지 않는 이유 (왜냐하면 C++ friend 개념과 비슷하게)에서 웹 전체를 검색 할 수있다. – Anero

+0

흠 .. 공용 인터페이스를 구현할 수없고 내부 속성을 사용할 수 없습니다. InternalsVisibleTo가 작동하지 않는 것 같아서 현재로서는 옵션이 아닙니다. – Qvin