我目前正在使用Castle.Windsor作为IoC容器使用NServiceBus 4.6.1。一般情况下,它工作正常,但我最近添加了一个实现IWantToRunWhenBusStartsAndStops
的类,并且永远不会调用此类。我怀疑问题是我的Castle.Windsor安装程序与NServiceBus如何扫描程序集以查找配置类等之间的冲突。
我在这个例子中使用标准的NServiceBus主机。我正在使用Castle.Windsor安装程序,它注册所有组件'WithServiceDefaultInterfaces()',因为我不想单独注册我使用的每个组件。我也使用Azure Service Bus作为传输机制,但我认为这不是问题的一部分。
请注意,我已尝试从等式中删除Castle.Windsor并调用我的启动代码(但当然处理程序因未注入依赖项而失败)。我想让两者同时运行,但我似乎无法找到配置所有内容的正确方法。
我已经把东西剥掉了,仍然遇到了问题,我的代码如下:
public class NServiceBusEndpointConfig : IConfigureThisEndpoint, AsA_Server,
UsingTransport<AzureServiceBus>,
IWantCustomInitialization
{
public void Init()
{
IWindsorContainer container = new WindsorContainer();
Configure.With().CastleWindsorBuilder(container);
container.Install(FromAssembly.This());
//I've tried running the installers before the Configure.With() line above, with no change in behaviour
}
}
public class DefaultInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromAssemblyInThisApplication()
.Pick()
.WithServiceDefaultInterfaces()
.LifestyleTransient());
}
}
public class Startup : IWantToRunWhenBusStartsAndStops
{
public void Start()
{
Console.WriteLine("Bus Started"); //this is never called
}
public void Stop()
{
Console.WriteLine("Bus Stopped");
}
}
使用了相关的NuGet包:
任何人都可以建议一种方法来实现我想要的吗?甚至是配置NServiceBus和Castle.Windsor的替代方法?
答案 0 :(得分:0)
我不确定这是修复还是解决方法,但我已设法解决问题。
就我而言,NServiceBus主机项目(我的问题中的代码)只包含NServiceBus相关代码(配置,消息处理程序等)。我依赖Castle.Windsor解析的所有依赖项都位于其他程序集/命名空间中。所以我修改了我的Castle.Windsor安装程序,只注册那些程序集中的类(并保持主机程序集不受影响),这解决了这个问题。 Castle.Windsor在我引用的程序集中注册了类型,NServiceBus处理了主机程序集 - 我的启动代码按照我的意愿调用,并且消息处理程序都像以前一样工作。
我的新Castle.Windsor安装程序如下:
public class DefaultInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromAssemblyNamed("MyReferencedAssembly")
.Pick()
.WithServiceDefaultInterfaces()
.LifestyleTransient());
}
}
我仍然有兴趣知道是否有人有更好的方法,但就目前而言:问题已经解决。
答案 1 :(得分:0)
未调用您的实现的原因是WithServiceDefaultInterfaces()
不会将EndpointConfig
注册为IWantToRunWhenBusStartsAndStops
的实现。它会尝试将其注册为不存在的接口IEndpointConfig
的实现,而不是其他任何东西。
话虽如此,你永远不应该注册NServiceBus自己选择的类型。让NServiceBus处理它。
有关详细信息,请查看我对https://github.com/Particular/NServiceBus.CastleWindsor/issues/2的评论。