私は本当にここで立ち往生しています。
asp.net mvcアプリケーションがあり、StructureMap 2.5.3(SM)を使用してコントローラーにサービスクラスとリポジトリクラスを挿入しています。すべてのコントローラーはSM工場で製造されています。
ハイブリッドでキャッシュしたいLinqtoSQLデータコンテキストもあります。
public class DBRegistry:Registry
{
public DBRegistry()
{
ForRequestedType<SharpShopDataContext>()
.CacheBy(StructureMap.Attributes.InstanceScope.Hybrid)
.TheDefault.IsThis(new SharpShopDataContext());
}
}
キャッシングが機能していないようで、そのためにデータコンテキストに問題が発生します。
複数のブラウザリクエストはすべて同じdbcontextを返しますか?!私のリポジトリクラスの1つに、このコードを配置しました。Debug.WriteLine( "db hashcode:" + db.GetHashCode()+ "" + DateTime.Now.ToString());
ここで、db = the datacontextまた、dbを使用してリポジトリのハッシュコードを出力し、リポジトリを使用してサービスを出力します。これは、複数のリクエストの出力です。
サービスハッシュコード:6238792 26-3-2009 18:59:34
リポジトリハッシュコード:21756593 26-3-2009 18:59:34
dbハッシュコード:7043935 26-3-2009 18:59:34
サービスハッシュコード:59389065 26-3-2009 18:59:34
リポジトリハッシュコード:8331620 26-3-2009 18:59:34
dbハッシュコード:7043935 26-3-2009 18:59:34
サービスハッシュコード:11291358 26-3-2009 18:59:38
リポジトリハッシュコード:13848497 26-3-2009 18:59:38
dbハッシュコード:7043935 26-3-2009 18:59:38
サービスハッシュコード:42509361 26-3-2009 18:59:38
リポジトリハッシュコード:56101068 26-3-2009 18:59:38
dbハッシュコード:7043935 26-3-2009 18:59:38
ご覧のとおり、7043935はリクエストごとに毎回データコンテキストのハッシュコードですが、サービスとリポジトリは毎回新しいインスタンスとハッシュコードを取得します。
これが原因で奇妙なエラーが発生します。たとえば、データベースが別のソースによって変更されているときに、dbcontextが4つのwebrequests前の元の値を持っているためにデータ同時実行例外が発生します。