-1

我想补充我在 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;
    }
}

但是,当我在现有 MessageEndpointMappings 集合上调用 Add 时出现异常:

启动端点时出现异常,已记录错误。原因:配置是只读的。

有没有更好的方法来加载现有配置并在代码中添加位?

4

1 回答 1

1

是的,不幸的是,映射集合被设置为只读!

这是一个解决方法(对不起反射的使用!)(我也在使用新的方法来覆盖配置设置IProvideConfiguration<T>):

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;
    }
}

顺便说一句,我将确保我们为 NServiceBus 的下一个主要版本修复此问题,请参阅https://github.com/NServiceBus/NServiceBus/issues/952

于 2013-02-07T01:03:41.803 回答