2

NServiceBus 4.0.3、StructureMap 2.6.4.0、NHibernate を使用しています

エンドポイントを次のように構成しました。

public class EndpointConfig : IConfigureThisEndpoint, 
    AsA_Client, IWantCustomInitialization
{
    public void Init()
    {
        Configure.With(
            .StructureMapBuilder(getContainer());

        Configure.Features.Disable<SecondLevelRetries>();
        Configure.Features.Disable<Sagas>();
        Configure.Features.Disable<TimeoutManager>();
    }
}

private IContainer getContainer()
{
    var container = new Container(x =>
    {

        x.Scan(s =>
        {
            s.WithDefaultConventions();
            s.TheCallingAssembly();
      });

        x.ForSingletonOf<ISessionFactory>().Use(createSessionFactory());
        x.For<ISession>().Use(context => 
            context.GetInstance<ISessionFactory>().OpenSession());
    });

    return container;
}

プラグイン ファミリがあり、実行時にオブジェクトのインスタンスを取得したい (コンストラクタ インジェクションを使用できない)。

StructureMap の世界では、以下を使用して実行できます。

ObjectFactory.GetNamedInstance<ISomething>("familyName");

しかし、NServiceBus を structuremap で使用している場合、メッセージごとにネストされたコンテナーが取得されます。
オブジェクトのインスタンスを取得したい場合、上記のコードは親コンテナーからのインスタンスのみを提供します。ObjectFactory は初期化されていないため、インスタンスを取得しません。

コンテナーで ObjectFactory を初期化するとイベントが発生します。これは静的ラッパーであるため、メッセージごとに使用しても安全ではありません。

では、プラグイン ファミリーを使用できるように、指定されたメッセージの子コンテナーをどのように処理すればよいでしょうか?

4

1 に答える 1

1

NServiceBus IBuilder API ( https://github.com/Particular/NServiceBus/issues/1565 )を介して子にアクセスすることはできません

しかし、StructureMap によって提供されるネイティブの IContainer インターフェイスをハンドラーに挿入することで、それを実現できると確信しています。

要するに:

StructureMap.IContainer に依存する

于 2013-12-18T08:41:33.210 に答える