2014-12-22 4 views
1

Представьте я что-то будет создан через завод:Как использовать Unity для инъекций зависимостей через фабрику?

public sealed class MyClass 
    : IMyClass 
{ 
    private IMyDao MyDao { get; set; } 

    public MyClass(IMyDaoFactory factory) 
    { 
     MyDao = factory.MyDao; 
    } 
} 

Это может решить через службу как:

public sealed class MyService 
    : IMyService 
{ 
    private readonly IMyClass myClass; 

    public MyService(IMyDaoFactory factory) 
    { 
     myClass = new MyClass(factory); 
    } 
} 

Это легко соединять в единстве, как:

var container = new UnityContainer(); 
container.RegisterType<IMyService, MyService>(); 
container.RegisterType<IMyDaoFactory, MyDaoFactory>(); 
container.RegisterType<IMyClass, MyClass>(); 

Отмечая регистрацию MyClass, как я могу установить Unity, чтобы он автоматически регистрировался и разрешался через фабрику? То есть то я больше не нужно:

myClass = new MyClass(factory); 

только:

this.myClass = myClass; (passed through the constructor 
         as IMyClass and resolved by Unity) 

Надежда, что имеет смысл. Заранее спасибо.

+0

Из любопытства, почему вам нужно использовать интерфейс для конкретного типа, учитывая, что интерфейс предоставляет поведение? –

+0

Это попытка избежать более далекого рефакторинга. Если я смогу это сделать, я могу оставить весь слой данных один. – Richard

+0

Ответ Натана кажется ОК; просто зарегистрируйте соответствующие зависимости, и Unity проведет все за вас. например В IMyClass будет введен IMyDaoFactory. Есть ли что-то еще, что вам нужно (возможно, с жизнью объекта)? –

ответ

0

Попробуйте переключить конструктор MyService на запрос одного экземпляра IMyClass; Unity должно автоматически заполнять пробелы и создавать экземпляры на основе сигнатур типа.

public MyService(IMyClass _myClass) 
{ 
    myClass = _myClass; 
} 

Хотя я бы тоже сменил имена, но да.

+0

Обычно я использую другой контейнер, поэтому Единство заставило меня почесывать голову, но как только я отработал, я мог (как обычно) беспокоиться о том, чтобы начать с вершины моего дерева зависимостей и работать оттуда, я был настроен. Наполнив пробелы, как это было. – Richard

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