Использование Factory для получения объектов Inject - PullRequest
6 голосов
/ 18 мая 2010

Является ли хорошей практикой использование метода Factory для извлечения внедренных объектов или можно использовать только метод Factory из инфраструктуры DI?

Я использую карту структуры, я должен просто использовать ObjectFactory.GetInstance (); или я должен создать фабричный класс, и внутри этого класса вызывать ObjectFactory.GetInstance () ;? потому что если я вызову ObjectFactory.GetInstance (); в моих классах я буду создавать связь с платформой DI? извините, если я не знаю, я новичок в этом понятии. Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 мая 2010

Фабричный метод полезен, когда вам нужен детальный контроль над , когда вам нужен экземпляр. Тем не менее, вы не должны напрямую зависеть от самого контейнера, а должны использовать метод фабрики как зависимость. Вот пример, иллюстрирующий это:

public class SomeController
{
    private Func<ISomeService> _serviceFactory;
    public SomeController(Func<ISomeService> serviceFactory)
    {
         _serviceFactory = serviceFactory;
    }

    public void DoSomeWork()
    {
       var service = _serviceFactory();
       ....
    }
}

Регистрационный код StructureMap будет выглядеть примерно так:

var container = new Container(cfg =>
    cfg.For<ISomeService>().Use(() => new SomeServiceImpl())
);
3 голосов
/ 18 мая 2010

Если вы уже используете платформу DI, зачем повторно внедрять фабричный шаблон, если он уже предоставлен платформой? Также не следует создавать зависимость с помощью инфраструктуры DI на бизнес-уровнях приложения. Там вы должны абстрагироваться с интерфейсами и абстрактными классами. Инфраструктура DI должна использоваться только на самом высоком уровне, например, в графическом интерфейсе, чтобы выполнить прокладку нижних уровней и выбрать, например, подходящий уровень доступа к данным.

...