数日前、ASP.Net のスレッド化で問題が発生しました。Web リクエストごとにシングルトン オブジェクトが必要でした。私は実際に私の仕事の単位にこれが必要です。ID マップがリクエスト全体で有効になるように、Web リクエストごとに作業単位をインスタンス化したかったのです。このようにして、IoC を使用して独自の IUnitOfWork をリポジトリ クラスに透過的に注入し、同じインスタンスを使用してエンティティをクエリしてから更新することができます。
Unityを使っているのでPerThreadLifeTimeManagerを間違えて使ってしまいました。ASP.Net スレッド モデルは、私が達成したいことをサポートしていないことにすぐに気付きました。基本的に、スレッドプールを使用してスレッドをリサイクルします。つまり、スレッドごとに 1 つの UnitOfWork を取得します!! ただし、私が望んでいたのは、Web リクエストごとに 1 つの作業単位でした。
少しグーグルで調べたところ、この素晴らしい投稿がありました。それがまさに私が望んでいたことです。達成するのが非常に簡単だった団結の部分を除いて.
これは、統一のための PerCallContextLifeTimeManager の私の実装です。
public class PerCallContextLifeTimeManager : LifetimeManager
{
private const string Key = "SingletonPerCallContext";
public override object GetValue()
{
return CallContext.GetData(Key);
}
public override void SetValue(object newValue)
{
CallContext.SetData(Key, newValue);
}
public override void RemoveValue()
{
}
}
そしてもちろん、これを使用して、次のようなコードで作業単位を登録します。
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
誰かの時間を少し節約できることを願っています。