0

У меня есть фасад в библиотеке, который предоставляет некоторые сложные функции через простой интерфейс. Мой вопрос заключается в том, как сделать инъекцию зависимостей для внутренних типов, используемых на фасаде. Скажем, мой C# код библиотеки выглядит -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 и facade.type2 равны нулю. Любая помощь приветствуется.

ответ

2

Если код создания контейнера находится вне сборки внутренних типов, Unity не видит и не создает и, следовательно, не может впрыскивать зависимости.

+0

Но если я устанавливаю [сборка: InternalsVisibleTo («Microsoft.Practices.Unity»)] не должно работать? – Qvin

+0

Я сомневаюсь, что Microsoft.Practices.Unity не является вызывающей сборкой, создание вашего контейнера. – Femaref

3

Ввод внутренних классов не рекомендуется.

Я бы создать класс общественного заводскую в сборке, которые объявляются внутренние реализации, которые могут быть использованы для создания экземпляров этих типов:

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

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

И зависимость в XYZFacade будет с классом FactoryClass:

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

Если вы хотите сделать его пригодным для тестирования, создайте интерфейс для FactoryClass.

+0

Ну, это все равно означает, что и IType1, и Type1 являются общедоступными, не так ли? Что делать, если я не хочу выставлять их за пределами библиотеки. Не существует способа сохранить их внутреннее и до сих пор делать инъекции зависимостей. – Qvin

+0

В этом случае вы можете сделать свойства из FactoryClass внутренними. Я бы серьезно подумал о том, как использовать InternalsVisibleTo, вы можете искать по всему Интернету, чтобы не использовать его (аналогично понятию друга C++). – Anero

+0

Хмм .. Я не могу реализовать открытый интерфейс и иметь внутренние свойства. InternalsVisibleTo, похоже, не работает, поэтому в данный момент это не вариант. – Qvin

Смежные вопросы