2

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做这样的事情的最好方法是什么?

4

3 回答 3

3

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

您可以使用诸如Autofac 的生命周期事件和/或自定义注册源之类的东西将自己的集成与bbvcommon Event BrokerNServiceBus之类的系统集成,但具体需要如何完成以及看起来如何取决于使用哪个系统你正在整合。您可以查看其他集成组件的来源以获得想法和模式。

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

于 2013-02-05T16:24:37.263 回答
2

猜测您想要类似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其作为依赖项添加到类型以使用它。不过我自己没试过。

也许它没有那么多即用型,但它仍然很容易。

更新

我已经编辑了代码示例以将代理变成一个单例,它应该是按预期工作所必需的。

于 2013-02-03T19:50:39.850 回答
0

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

于 2013-06-30T13:40:50.993 回答