-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 に答える