我只花了最后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);
}
}
}