在工厂方法中使用 Autofac

发布于 2024-11-26 19:03:20 字数 545 浏览 2 评论 0 原文

我有点困惑,我有一个关于领域事件的片段,其中`

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 的意义何在?直接在其他地方引用它不是很好吗?

I am bit confused I have a snippet on domainevents where `

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

where StructureMap is exploited. I just embarked on DI using Autofac how this supposed to be implemented in Autofac. Since there is no notion of Static Class.

In general is this approach correct ? what is the point of using DI within the Factory class would not be nice to refer it directly somewhere else ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

恰似旧人归 2024-12-03 19:03:20

这个特定的示例实际上是为您提供的 OOB。只需依赖 IEnumerable>,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 处理域事件的示例方法。将事件传播到处理程序的类可以在此处找到。

This particular example is actually provided for you OOB. Just take a dependency on IEnumerable<IDomainEventHandler<>> and Autofac will serve the collection to you:

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

Update: here's an example of a factory class that could include some logic around resolving services from a container:

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>>>();
    }
}

That said, I encourage you to explore the possibilities of using strongly-typed metadata in Autofac. By "tagging" services with metadata, factory classes can do extensive logic only by examining the metadata and thus have as little as possible dependency on the actual framework used.

Update 2: thanks to @Nicholas, here's an excellent sample approach to domain events using Autofac. The class that propagate events to handlers can be found here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文