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