Autofac:发布/订阅扩展

时间:2013-02-03 18:35:38

标签: .net autofac publish-subscribe messagebroker

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做这样的事情吗?

3 个答案:

答案 0 :(得分:3)

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

您可以使用bbvcommon Event Broker和/或NServiceBus这样的系统推送自己与Autofac's lifetime eventscustom registration sources等系统的集成,但具体如何需要完成这看起来将取决于您正在整合的系统。您可以查看其他集成组件的源代码以获取想法和模式。

如果你确实有所作为,你可以考虑将其作为Autofac.Extras项目提供。

答案 1 :(得分: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添加为要使用它的类型的依赖项。我自己没试过。

也许它没有那么多随时可用,但它仍然很容易。

<强>更新

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

答案 2 :(得分:0)

消息代理体系结构本身并不依赖于您正在使用的容器。有关.NET消息代理的一些示例,请查看this article,包括一个基于Rx的示例。