Unity 1.2 Внедрение зависимостей внутренних типов - PullRequest
1 голос
/ 10 июня 2010

У меня есть фасад в библиотеке, который предоставляет некоторые сложные функции через простой интерфейс. Мой вопрос заключается в том, как сделать внедрение зависимостей для внутренних типов, используемых в фасаде. Допустим, мой код библиотеки C # выглядит так -

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>();

Здесь фасад.SomeFunction () генерирует исключение, так как фасад. Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

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

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

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.

2 голосов
/ 10 июня 2010

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

...