我有点困惑我在domainevents上有一个片段,其中`
public class StructureMapDomainEventHandlerFactory : IDomainEventHandlerFactory
{
public IEnumerable<IDomainEventHandler<T>> GetDomainEventHandlersFor<T>
(T domainEvent) where T : IDomainEvent
return ObjectFactory.GetAllInstances<IDomainEventHandler<T>>();
}
利用StructureMap。我刚刚开始使用Autofac进行DI,这应该如何在Autofac中实现。因为没有静态类的概念。
一般来说这种方法是否正确?在Factory类中使用DI有什么意义,将它直接引用到其他地方并不好?
答案 0 :(得分:2)
这个特定的例子实际上是为你提供的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>>>();
}
}
尽管如此,我鼓励您探索使用strongly-typed metadata in Autofac的可能性。通过使用元数据“标记”服务,工厂类只能通过检查元数据来执行大量逻辑,因此尽可能少地依赖于所使用的实际框架。
更新2 :感谢@Nicholas,这是一个很棒的sample approach to domain events using Autofac。可以在here找到将事件传播给处理程序的类。