NServiceBus - 使用Castle.Windsor时不调用实现IWantToRunWhenBusStartsAndStops的类

时间:2014-08-13 23:03:27

标签: castle-windsor nservicebus

我目前正在使用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 4.6.1
  • NServiceBus.Interfaces 4.6.1
  • NServiceBus.Host 4.6.1
  • NServiceBus.CastleWindsor 4.6.1
  • NServiceBus.Azure.Transports.WindowsAzureServiceBus 5.3.0
  • Castle.Windsor 3.2.1
  • Castle.Core 3.3.0

任何人都可以建议一种方法来实现我想要的吗?甚至是配置NServiceBus和Castle.Windsor的替代方法?

2 个答案:

答案 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的评论。