Nservicebus n服务总线。如何在不同的AppDomain中启动多个总线?

Nservicebus n服务总线。如何在不同的AppDomain中启动多个总线?,nservicebus,Nservicebus,我想在一个过程中有几辆公共汽车。我在谷歌上搜索了一下,发现只有拥有几个AppDomain才有可能。但我不能让它工作 这是我的代码示例(我在一个类库中执行所有操作): 使用系统; 使用系统诊断; 运用系统反思; 使用MyMessages; 使用NServiceBus; 使用NServiceBus.Config; 使用NServiceBus.Config.ConfigurationSource; 命名空间订阅1 { 公共类发送器 { 公共静态void Main() { var domain=AppD

我想在一个过程中有几辆公共汽车。我在谷歌上搜索了一下,发现只有拥有几个AppDomain才有可能。但我不能让它工作

这是我的代码示例(我在一个类库中执行所有操作):

使用系统;
使用系统诊断;
运用系统反思;
使用MyMessages;
使用NServiceBus;
使用NServiceBus.Config;
使用NServiceBus.Config.ConfigurationSource;
命名空间订阅1
{
公共类发送器
{
公共静态void Main()
{
var domain=AppDomain.CreateDomain(“someDomain”,AppDomain.CurrentDomain.Evidence);
Load(Assembly.getExecutionGassembly().GetName());
domain.CreateInstance(Assembly.getExecutionGassembly().FullName,typeof(PluginBusCreator.FullName);
//这里我有一些代码可以将消息发送到“PluginQueue”。
}
}
公共类插件创建器
{
公共插件创建器()
{
var Bus=Configure.With(
Assembly.Load(“NServiceBus”)、Assembly.Load(“NServiceBus.Core”),
Assembly.LoadFrom(“NServiceBus.Host.exe”),Assembly.GetCallingAssembly()
.CustomConfigurationSource(新的PluginConfigurationSource())
.SpringFrameworkBuilder()
.XmlSerializer().MsmqTransport()
.UnicastBus().LoadMessageHandlers().CreateBus().Start();
}
受保护的IBus总线{get;set;}
}
类PluginConfiguration源:IConfigurationSource
{
public T GetConfiguration(),其中T:class
{
{
if(typeof(T)=typeof(MsmqTransportConfig))
返回新的MsmqTransportConfig
{
ErrorQueue=“error”,
InputQueue=“PluginQueue”,
MaxRetries=1,
NumberOfWorkerThreads=1
}as-T;
返回null;
}
}
}
公共类SomeHandler:IHandleMessages
{
公共无效句柄(EventMessage1消息)
{
Debugger.Break();
}
}
}

我也不会调用处理程序。 如果你有任何想法,请帮忙。我一直在努力解决这个问题。 另外,如果需要发布完整代码,请告知

我需要几辆公交车来解决以下问题:

我有我的目标应用程序和几个插件。我们决定根据服务总线模式制作插件

每个插件可以有几个配置文件

所以,目标应用程序(它是web应用程序)正在发布消息,消息中有一些内容已更改。订阅此消息的每个插件都需要对每个概要文件执行一些操作。但插件对其配置文件一无所知(客户正在编写插件)。当消息处理开始时,插件中应该只注入配置文件

我们决定有一些RecepientList(模式在“企业集成模式”中描述),它了解插件配置文件,遍历它们,并使用注入的配置文件重新发送消息(因此,如果插件有多个配置文件,则会向它发送多条消息)

但我不想让每个插件在新的过程中被调用。我希望在启动期间为每个插件动态配置总线。一应俱全。但我似乎需要在不同的应用程序域中完成。所以我有一个上面描述的问题:-)。

谢尔盖

我不清楚为什么每个插件都需要有自己的总线。难道他们不能坐在同一辆公共汽车上吗?每个插件开发人员都会像以前一样编写消息处理程序,订阅将通过总线自动进行

然后,您也不需要指定加载每个NServiceBus DLL

顺便说一句,按名称加载程序集往往会导致问题-请尝试使用此选项指定程序集:


typeof(IMessage).Assembly,typeof(MsmqTransportConfig).Assembly,typeof(IConfigureThisEndpoint.Assembly

谢谢你的回答,Udi!让我更深入地解释一下:例如,我有两个插件在监听实体更新的消息。每个插件都有几个概要文件。当目标应用程序向插件发送实体更新消息时,我希望发生以下情况1。)插件1收到两条消息。每条消息都有相似的上下文,但注入了不同的概要文件。2.)插件2——相同。消息中注入配置文件数据的这一功能是我最近列表的职责。如果所有插件只有一条总线,我不知道如何实现这一点。
using System;
using System.Diagnostics;
using System.Reflection;
using MyMessages;
using NServiceBus;
using NServiceBus.Config;
using NServiceBus.Config.ConfigurationSource;

namespace Subscriber1
{
public class Sender
{
    public static void Main()
    {
        var domain = AppDomain.CreateDomain("someDomain", AppDomain.CurrentDomain.Evidence);
        domain.Load(Assembly.GetExecutingAssembly().GetName());
        domain.CreateInstance(Assembly.GetExecutingAssembly().FullName, typeof (PluginBusCreator).FullName);
        //here I have some code to send messages to "PluginQueue".
    }
}

public class PluginBusCreator
{
    public PluginBusCreator()
    {
        var Bus = Configure.With(
            Assembly.Load("NServiceBus"), Assembly.Load("NServiceBus.Core"),
            Assembly.LoadFrom("NServiceBus.Host.exe"), Assembly.GetCallingAssembly())
            .CustomConfigurationSource(new PluginConfigurationSource())
            .SpringFrameworkBuilder()
            .XmlSerializer().MsmqTransport()
            .UnicastBus().LoadMessageHandlers<First<SomeHandler>>().CreateBus().Start();
    }

    protected IBus Bus { get; set; }
}

class PluginConfigurationSource : IConfigurationSource
{
    public T GetConfiguration<T>() where T : class
    {
        {
            if (typeof (T) == typeof (MsmqTransportConfig))
                return new MsmqTransportConfig
                        {
                            ErrorQueue = "error",
                            InputQueue = "PluginQueue",
                            MaxRetries = 1,
                            NumberOfWorkerThreads = 1
                        } as T;
            return null;
        }
    }
}

public class SomeHandler : IHandleMessages<EventMessage1>
{
    public void Handle(EventMessage1 message)
    {
        Debugger.Break();
    }
}