【问题标题】:Autofac: publish/subscribe extensionAutofac:发布/订阅扩展
【发布时间】:2013-01-18 12:12:31
【问题描述】:

Autofac 是否支持易于使用的消息代理来执行多对多发布/订阅事件消息传递?

编辑:

public class Service1
{
    [Publish("message://an-event")]
    public event Event<EventParams> AnEvent;

    public void DoSomething()
    {
        // do something
        // [...]

        // publish message
        if (AnEvent != null)
            AnEvent(this, new EventParams(something))
    }
}

public class Service2
{
    [Subscribe("message://an-event")]
    public OnAnEvent(object sender, EventParams eventParams)
    {
        Console.WriteLine("Hello World from Service2")
    }
}

public class Service3
{
    [Subscribe("message://an-event")]
    public OnAnEvent(object sender, EventParams eventParams)
    {
        Console.WriteLine("Hello World from Service3")
    }
}

Ninjects 消息中断器扩展的酷之处在于它的简单性。您只需为发布某些内容的事件和订阅此事件的方法添加注释。容器自动处理连接。您只需要绑定服务。

autofac 有类似的东西吗?如果不是,那么使用 autofac 执行此类操作的最佳方法是什么?

【问题讨论】:

  • “支持”是什么意思(是“我该怎么做”还是“有现成的扩展程序”)? “易于使用”是什么意思?
  • 易于使用我主要指的是一个现成的扩展,就像 ninject 提供的那样
  • 请发布一个指向显示您想要的页面的链接,或粘贴代码 sn-p。对于不了解 Ninject 的人来说,很难猜出你想要什么。

标签: .net autofac publish-subscribe messagebroker


【解决方案1】:

消息代理架构本身并不依赖于您正在使用的容器。查看this article 了解一些 .NET 消息代理的示例,包括基于 Rx 的。

【讨论】:

    【解决方案2】:

    Autofac 目前不提供任何特定的消息代理支持。 Autofac 是一个 IoC 容器,而不是消息代理,如果要添加任何内容,它将是支持Ninject's bbeventbroker 工作方式的外部系统 - 可能有助于连接事件处理,但不能正确管理实际代理。 (就像 Autofac 不做自己的 MVC 或 WCF 实现一样——只是与现有系统交互的助手。)

    您可以使用Autofac's lifetime events 和/或custom registration sources 之类的方式将自己的集成与bbvcommon Event BrokerNServiceBus 之类的系统进行集成,但具体需要如何完成以及看起来会是什么样子取决于在您正在集成的系统上。您可以查看其他集成组件的来源以获得想法和模式。

    如果您确实得到了一些工作,您可能会考虑将其作为 Autofac.Extras 项目包含在内。

    【讨论】:

    • 在我看来,使用 NServiceBus 就像“用大锤敲碎坚果”,但 bbvcommon EventBroker 看起来很小且易于使用。
    • 我并没有推荐要使用的特定经纪人,只是将这些作为示例。我敢肯定,还有其他人。由您来评估您的选择并确定最适合您的选择。
    【解决方案3】:

    猜测您想要https://github.com/ninject/ninject.extensions.weakeventmessagebroker 之类的东西,答案肯定是“是”。事实上,我不明白为什么要将消息代理实现绑定到 IoC 容器。它们是完全独立的组件,具有完全独立的任务。您可以选择任何消息代理实现并将其注册到任何 IoC 容器。

    您甚至可以选择 ninject.extensions.weakeventmessagebroker 并将其注册到 Autofac,如下所示:

    builder.RegisterType<EventReflectionStrategy>().As<IPlanningStrategy>();
    builder.RegisterType<EventBindingStrategy>().As<IActivationStrategy>();
    builder.RegisterType<WeakEventMessageBroker>().As<IWeakEventMessageBroker>()
           .SingleInstance();
    

    然后将IWeakEventMessageBroker 作为依赖添加到类型以使用它。不过我自己没试过。

    也许它没有那么多即用型,但它仍然非常简单。

    更新

    我已经编辑了代码示例以将代理转换为单例,这应该是它按预期工作所必需的。

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 2020-11-02
      • 1970-01-01
      相关资源
      最近更新 更多