让RhinoServiceBus与PRISM / Unity很好地配合

时间:2013-05-09 00:02:52

标签: c# wpf unity-container prism-4 rhino-servicebus

我只花了最后48小时试图让上述事情发生,而我认为Rhino Service Bus非常有用,他们的文档还有很多不足之处。解决了我面临的问题后,我认为让别人看到我做的事情可能会有用......所以这就是了。希望有人会发现它。

我正在开发一个WPF / PRISM / Unity报告应用程序,并希望使用服务总线允许应用程序偶尔连接,通过VPN连接时通过总线消息获取数据。我将该总线引入了App的Bootstrapper并将其托管在Rhino DefaultHost中。这确实允许总线运行并且消息来回传递非常令人满意,直到我试图将IEventAggregator注入到实现ConsumerOf接口的类的构造函数中。

我一直收到错误“IEventAggregator是一个接口,无法构造。你是否缺少类型注册”,我不知道为什么因为Event聚合器在应用程序的Bootstrapper中注册为单例。

问题似乎是注册实现ConsumerOf的类将该类绑定到总线的内部Unity容器,该容器似乎覆盖了类可能对应用程序容器的任何连接。

解决方案(我承认,一旦你看到它就非常明显)是使总线容器成为应用程序容器的子容器,以便任何失败的解决方案(找不到IEventAggregator?!)都传递给父容器分辨率(哦,看,这是!!)。

这是如何实现的......

protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    //Singletons
    var accountData = new AccountService();

    //ServiceBus
    var host = new DefaultHost();
    host.Start<ESBBootStrapper>();

    var childContainer = Container.CreateChildContainer();
    new RhinoServiceBusConfiguration().UseUnity(childContainer).Configure();
    var bus = childContainer.Resolve<IStartableServiceBus>();
    bus.Start();

    //Application Instances
    Container.RegisterInstance(bus as IServiceBus, new ContainerControlledLifetimeManager());

}

我还需要修改ESBBootstrapper中的相同覆盖,以便在应用程序中找到正在实现ConsumerOf的类。这样做如下......

public class ESBBootStrapper : UnityBootStrapper
{
    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();
        foreach (var current in AppDomain.CurrentDomain.GetAssemblies())
        {
            ConfigureConsumers(current);
        }
    }
}

0 个答案:

没有答案