2

サービスバス(MassTransit)からのメッセージも消費するasp.netプロセスがあります。Web リクエストの場合、データベース セッションは PerWebRequest ライフスタイルで解決されます。

しかし、プロセスが MassTransit からのメッセージを消費する場合、HttpContext を使用できないため、データベース セッションに別のライフスタイルを持たせる必要があります。

私はこれを作りました:

    public class PerRequestLifeStyleManager : ILifestyleManager
{
    readonly PerWebRequestLifestyleManager perWebRequestLifestyleManager;
    readonly PerThreadLifestyleManager perThreadLifestyleManager;

    public PerRequestLifeStyleManager()
    {
        perWebRequestLifestyleManager = new PerWebRequestLifestyleManager();
        perThreadLifestyleManager = new PerThreadLifestyleManager();            
    }

    public void Init(IComponentActivator componentActivator, IKernel kernel, ComponentModel model)
    {
        perWebRequestLifestyleManager.Init(componentActivator, kernel, model);
        perThreadLifestyleManager.Init(componentActivator, kernel, model);
    }

    public object Resolve(CreationContext context)
    {
        return GetManager().Resolve(context);
    }

    public bool Release(object instance)
    {
        return GetManager().Release(instance);
    }

    public void Dispose()
    {
        GetManager().Dispose();
    }

    ILifestyleManager GetManager()
    {
        if (HttpContext.Current != null)
        {
            return perWebRequestLifestyleManager;
        }

        return perThreadLifestyleManager;
    }
}

これが正しい方法であるかどうか、誰か教えてもらえますか? そうでない場合、何ですか?

ありがとう。

編集: 動作するように見えるコードで質問を更新しました (テストされていない前)。ウィンザーの観点から見て、これが安全で健全であるかどうか、私はまだ知りたがっています.

4

2 に答える 2

4

ハイブリッドライフスタイルの1つを使用してみてください。

于 2011-08-26T13:34:29.730 に答える
3

Castle Windsor 拡張機能を使用すると、ISession をコンシューマー クラスのコンストラクターに依存させることができます。そうすることで、コンテナーは ISession のライフサイクルを管理し、MT によってコンシューマーが破棄されるとそれを破棄します。

さらに詳細な制御が必要な場合は、WindsorConsumerFactory がどのように実装され、コンシューマーへのメッセージ配信に関連するコンシューマー クラス インスタンスの解決と解放をラップするかを確認できます。

それを超えて何かを注入する必要がある場合は、インターセプターを使用することもできます。

MassTransit 使用時の作業単位

于 2011-08-26T17:09:52.977 に答える