在Factory方法中使用Autofac

时间:2011-07-28 12:31:56

标签: dependency-injection autofac factories

我有点困惑我在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有什么意义,将它直接引用到其他地方并不好?

1 个答案:

答案 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找到将事件传播给处理程序的类。