C# 让RhinoServiceBus与PRISM/Unity完美配合

C# 让RhinoServiceBus与PRISM/Unity完美配合,c#,wpf,unity-container,prism-4,rhino-servicebus,C#,Wpf,Unity Container,Prism 4,Rhino Servicebus,我刚刚花了48小时试图实现上述目标,虽然我认为Rhino Service Bus非常有用,但他们的文档还有很多需要改进的地方。在解决了我面临的问题后,我想让别人看看我做了什么可能会有用。。。就是这样。希望有人会发现这一点 我正在开发一个WPF/PRISM/Unity报告应用程序,并希望使用服务总线使该应用程序成为偶尔连接的应用程序,在通过VPN连接时通过总线消息获取数据。我将总线引入应用程序的引导程序,并将其托管在Rhino DefaultHost中。在我尝试将IEventAggregator注

我刚刚花了48小时试图实现上述目标,虽然我认为Rhino Service Bus非常有用,但他们的文档还有很多需要改进的地方。在解决了我面临的问题后,我想让别人看看我做了什么可能会有用。。。就是这样。希望有人会发现这一点

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

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

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

解决方案(我承认,一旦您看到它,这是显而易见的)是将总线容器作为应用程序容器的子容器,以便将任何失败的解决方案(找不到IEventAggregator?!)传递给父容器进行解决(哦,看,它在这里!!)

这是如何实现的

protected override void ConfigureContainer()
{
base.ConfigureContainer();
//单身汉
var accountData=new AccountService();
//服务总线
var host=new DefaultHost();
host.Start();
var childContainer=Container.CreateChildContainer();
新RhinoServiceBusConfiguration().UseUnity(childContainer.Configure();
var bus=childContainer.Resolve();
bus.Start();
//应用程序实例
RegisterInstance(总线作为IServiceBus,新的ContainerControlledLifetimeManager());
}
我还需要修改ESBBootstrapper中的相同覆盖,以便在应用程序中找到实现ConsumerOf的类。这是按如下方式完成的

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