используя метод Autofac в Factory

Я немного запутался. У меня есть фрагмент событий домена, где `

public class StructureMapDomainEventHandlerFactory : IDomainEventHandlerFactory
{
    public IEnumerable<IDomainEventHandler<T>> GetDomainEventHandlersFor<T>
                                           (T domainEvent) where T : IDomainEvent
        return ObjectFactory.GetAllInstances<IDomainEventHandler<T>>();
}

где используется StructureMap. Я только что приступил к DI с помощью Autofac, как это должно быть реализовано в Autofac. Поскольку нет понятия статического класса.

В целом правильный ли это подход? какой смысл использовать DI в классе Factory, было бы неплохо ссылаться на него напрямую где-то еще?


person mobygeek    schedule 28.07.2011    source источник


Ответы (1)


Этот конкретный пример фактически предоставляется вам OOB. Просто возьмите зависимость от IEnumerable<IDomainEventHandler<>>, и Autofac предоставит вам коллекцию:

public class ClientClass
{
     public ClientClass(IEnumerable<IDomainEventHandler<OfSomeType>> eventHandlers)
     {
     }
}

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

public class AutofacDomainEventHandlerFactory : IDomainEventHandlerFactory
{
    private readonly IComponentContext _context;
    public AutofacDomainEventHandlerFactory(IComponentContext context)
    {
        _context = context;
    }

    public IEnumerable<IDomainEventHandler<T>> GetDomainEventHandlersFor<T>
                                           (T domainEvent) where T : IDomainEvent
    {
        return _context.Resolve<IEnumerable<IDomainEventHandler<T>>>();
    }
}

Тем не менее, я рекомендую вам изучить возможности использования строго типизированных метаданных в Autofac. «Помечая» службы метаданными, фабричные классы могут выполнять обширную логику только путем изучения метаданных и, таким образом, иметь как можно меньшую зависимость от фактической используемой среды.

Обновление 2: спасибо @Nicholas, вот отличный пример подхода к событиям домена с использованием Autofac. Класс, передающий события обработчикам, можно найти здесь .

person Peter Lillevold    schedule 28.07.2011
comment
хорошо, спасибо. однако какова корреляция фабричного класса с ди-фреймворками. Как мы должны использовать его в комбинации. Просмотрел некоторые материалы о фабриках делегатов в autofac, но что, если логика сложна. - person mobygeek; 28.07.2011
comment
ИМО, фабричные классы находятся где-то между DI и бизнес-логикой. Иногда нам нужна определенная логика вокруг наших решений. Эти фабрики, безусловно, будут привязаны к фреймворку (как показывает ваш образец StructureMap), и Autofac ничем не отличается. Я обновлю свой пример, чтобы показать, как можно заставить фабричный класс взаимодействовать с контейнером. - person Peter Lillevold; 28.07.2011
comment
Здесь есть полный/исполняемый пример, показывающий события домена с помощью Autofac: github.com/readify/iocdevday. Конкретный класс, выполняющий эту роль, — github.com/Readify/IocDevDay/ blob/master/TinySheets/Eventing/. - person Nicholas Blumhardt; 29.07.2011
comment
Ах, очень хороший и чистый образец приложения! Спасибо, что поделился :) - person Peter Lillevold; 29.07.2011
comment
Николас, мне понравилось, как ты закодировал пример iocdevday. Пожалуйста, не обращайте внимания на мои частые вопросы, однако есть ли какой-либо источник, на который я могу сослаться, где он указывает на руководства по подходу, который вы использовали для создания доменных событий ddd. благодарю вас - person mobygeek; 01.08.2011