【问题标题】:NServicebus Message Handler Lifecycle in IOC StructureMapIOC StructureMap 中的 NServicebus 消息处理程序生命周期
【发布时间】:2009-11-07 11:08:30
【问题描述】:

如果我希望处理每条消息的实例,我需要结合 NServiceBus 消息处理程序使用所需的 IOC 实例生命周期。

PerRequest 不起作用,因为考虑到我有大量的构造函数依赖和依赖图,当我每个 Handle(MessageX msg) 调用只需要一个时,它给了我很多实例。我不能或不想将它直接注入到消息处理程序中,因为它需要在对象图的下方。例如。注入 IPersonService,依赖于 IPersonRepository,它们可以是每个请求(默认),但 IPersonDBContext 需要是每个消息调用。

PerThread 无法工作,因为 NServiceBus 一遍又一遍地使用相同的工作线程。

Singleton、HttpContext等..显然不适用。

有人用 StructureMap 或 Castle 遇到过这种情况吗?

【问题讨论】:

    标签: structuremap ioc-container nservicebus lifecycle


    【解决方案1】:

    我可能在这里遗漏了一些东西,但是 PerRequest 将为每个 MessageHandler 提供一个新实例(消息处理程序是它们自己注册为 PerRequest)。我刚刚修复了一个导致消息处理程序为每条消息多次触发的错误。我想知道这个错误是否误导了您(尝试从 CI 获取最新的 2.0 版本,看看是否适合您)

    http://teamcity.codebetter.com/viewLog.html?buildId=7087&tab=artifacts&buildTypeId=bt96

    希望这会有所帮助!

    【讨论】:

    • 是的,如果我的 IMessageHandler 依赖于 IPersonService 和 IAnimalService,它们会根据请求进行构造注入(我相信大多数 IOC 的默认设置),但是可以说 IPersonService 和 IAnimalService 都依赖于 IDbContext,在PerRequest 然后我得到 2 个 IDbContext 实例(对于其他两个依赖项)而不是一个(即使它与 2 个服务/存储库交互也是一个 uow)。在 Web 上下文中,我可以将 IDbContext 设置为 HttpContext,在非 Web 线程上下文中,我可以为每个线程设置 IDbContext。我看不出如何在每个 Handle(msg) 调用中实现一个 IDbContext。
    • 我们在 NServiceBus 中解决这个问题的方法是注入一个 ISessionFactory 而不是 ISession。我们有一个消息模块,它管理会话工厂上会话的打开和关闭,所有应用程序代码都使用 SessionFactory.GetCurrentSession() 希望有所帮助。
    • 乌迪,这太糟糕了!我等不及 3.0 了 :)
    • 我遇到了一个非常相似的问题。期待子容器支持来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多