NServiceBus通过代码订阅附加队列

NServiceBus通过代码订阅附加队列,nservicebus,Nservicebus,我想补充我在App.config文件的UnicastBusConfig部分中订阅的端点,以便添加到另一个要订阅的队列中 为此,我添加了一个自定义配置源,如下所示 public class MyConfigSource : IConfigurationSource { public T GetConfiguration<T>() where T : class, new() { // the part you are overriding

我想补充我在App.config文件的UnicastBusConfig部分中订阅的端点,以便添加到另一个要订阅的队列中

为此,我添加了一个自定义配置源,如下所示

public class MyConfigSource : IConfigurationSource
{
    public T GetConfiguration<T>() where T : class, new()
    {
        // the part you are overriding
        if (typeof(T) == typeof(UnicastBusConfig))
        {
            var config = ConfigurationManager.GetSection(typeof(T).Name) as UnicastBusConfig;

            config.MessageEndpointMappings.Add(new MessageEndpointMapping() { Endpoint = "MyQueue", Messages = "MyMessageNamespace" });
        }

        // leaving the rest of the configuration as is:
        return ConfigurationManager.GetSection(typeof(T).Name) as T;
    }
}
公共类MyConfigSource:IConfigurationSource
{
public T GetConfiguration(),其中T:class,new()
{
//您要覆盖的部分
if(typeof(T)=typeof(UnicastBusConfig))
{
var config=ConfigurationManager.GetSection(typeof(T).Name)作为UnicastBusConfig;
config.MessageEndpointMappings.Add(新的MessageEndpointMapping(){Endpoint=“MyQueue”,Messages=“MyMessageNamespace”});
}
//将其余配置保持原样:
将ConfigurationManager.GetSection(typeof(T).Name)返回为T;
}
}
但是,在现有MessageEndpointMappings集合上调用Add时,会出现异常:

启动终结点时出现异常,已记录错误。原因:这个 配置为只读


是否有更好的方法加载现有配置并在代码中向其添加位?

是,很遗憾,映射集合设置为只读

这里有一个解决方法(很抱歉使用了反射!)(我还使用了新的方法来覆盖配置设置
iprovidonconfiguration
):

class UnicastBusConfigOverride:IPProvisionConfiguration
{
公共UnicastBusConfig GetConfiguration()
{
var unicastBusConfig=Configure.ConfigurationSource.GetConfiguration();
类型(配置元素集合)
.GetField(“bReadOnly”,BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(unicastBusConfig.MessageEndpointMappings,false);
unicastBusConfig.MessageEndpointMappings.Add(新建MessageEndpointMapping(){Endpoint=“MyQueue”,Messages=“MyMessages”});
返回unicastBusConfig;
}
}

顺便说一句,我将确保我们在下一个主要版本的NServiceBus中修复此问题,请参见

哦,非常棒的IProvisionConfiguration看起来更整洁我现在就把你的反映放进去,让它更干净,可以构建一个新的UnicastBusConfig并从配置文件派生的属性上克隆?这至少不会像反射那样脆弱。
class UnicastBusConfigOverride : IProvideConfiguration<UnicastBusConfig>
{
    public UnicastBusConfig GetConfiguration()
    {
        var unicastBusConfig = Configure.ConfigurationSource.GetConfiguration<UnicastBusConfig>();

        typeof(ConfigurationElementCollection)
            .GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
            .SetValue(unicastBusConfig.MessageEndpointMappings, false);

        unicastBusConfig.MessageEndpointMappings.Add(new MessageEndpointMapping() { Endpoint = "MyQueue", Messages = "MyMessages" });

        return unicastBusConfig;
    }
}