1

SimpleInjectorとハイブリッドWebリクエスト/スレッドのライフスタイルに関する最近の質問に続いて、私は技術的な要件を完全に理解しておらず、実際には必要のないことを行っているようです。

このコードで

interface IUnitOfWork { }
interface IWebUnitOfWork : IUnitOfWork { }
interface IThreadUnitOfWork : IUnitOfWork { }
class UnitOfWork : IWebUnitOfWork, IThreadUnitOfWork { }

container.RegisterPerWebRequest<IWebUnitOfWork, UnitOfWork>();
container.RegisterLifetimeScope<IThreadUnitOfWork, UnitOfWork>();
container.Register<IUnitOfWork>(() => container.GetInstance<UnitOfWork>());

// Register as hybrid PerWebRequest / PerLifetimeScope.
container.Register<UnitOfWork>(() =>
{
    if (HttpContext.Current != null)
        return container.GetInstance<IWebUnitOfWork>() as UnitOfWork;
    else
        return container.GetInstance<IThreadUnitOfWork>() as UnitOfWork;
});

私の理解では、IIS内で実行されているAppDomainのIWebUnitOfWork場合はが返されます。そうでない場合は、LifetimeScopeのインスタンスを明示的に宣言してコンテナーへの呼び出しをラップしない限りエラーが発生します(これにより)が返されIThreadUnitOfWorkます。

次の声明は、私が何をしているかを完全には理解していないことに気づきました!

ただし、すべてを追加するハイブリッドライフスタイルは必要ないようです。ハイブリッドライフスタイルは、動的に(GetInstanceの呼び出しごとおよびインジェクションごとに)切り替えることができるライフスタイルですが、起動時に切り替える必要があるだけのようです。

私の質問はこれです:IIS内で実行されているAppDomain内にロードされたコンテナ(またはその他のクラス)は、静的またはインスタンスであり、HttpContextが存在しなくても呼び出すことができますか?

4

1 に答える 1

1

Stevenがコメントで概説しているように、Webリクエストが別のスレッドでプロセスを開始できる場合は、通常、ハイブリッド登録が必要です。この状況では、コンテナはWebリクエストとスレッドリクエストの両方のリクエストを処理するように要求される可能性があります。

于 2013-02-05T09:04:43.010 に答える