Использование Autofac в методе Factory

Я немного растерялся, у меня есть фрагмент кода на Domainevents, где `

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, было бы неплохо ссылаться на него непосредственно где-то еще?

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. Класс, который передает события обработчикам, можно найти здесь.

Другие вопросы по тегам