1

私はStructureMap、EF 4.1/POCOを使用しています。コンソールアプリは、あるデータセットに対して2つの結果として生じる操作を実行することを想定しています。たとえば、operation1とoperation2です。DbContextをシングルトンとして設定しました。これにより、operation1がDbContextにゴミを残し、operation2が正常に機能しなくなるため、operation2で問題が発生します。同時に、「呼び出しごと」にDbContextを設定することはできません。cozoperation1は、コンストラクターを通過する同じDbContextを共有する2つのリポジトリを使用します。したがって、理想的には、operation2の前にDbContextを再初期化/リセット/クリーンアップする必要があります。何か案は?

ありがとう

4

1 に答える 1

6

単に2つの異なるコンテキストを使用します。コンテキストをリセットしてから新しいコンテキストを作成するためのより良い解決策はありません。現在のアーキテクチャと戦っている場合は、新しいシナリオをサポートするようにアーキテクチャを改善するだけです。コンテキストインスタンスを渡す代わりに、必要な数のコンテキストインスタンスを作成できるコンテキストファクトリを渡します。リポジトリと同じです。ファクトリを使用して、オンデマンドで新しいリポジトリインスタンスを作成できます。

例を使用して編集します。

EFv4.1Update1を使用していると仮定しましょう。新しいインターフェースを提供しますIDbContexFactory<TContext>。次のようにクラスを定義できます。

public class YourClass
{
    private readonly IDbContextFactory<IYourContext> _factory;

    public YourClass(IDbContextFactory<IYourContext> factory) 
    {
        _factory = factory;
    }

    public void Operation1() 
    {
        using (IYourContext context = _factory.Create()) 
        {
            RepositoryA repository = new RepositoryA(context);
            RepositoryB repository = new RepositoryB(context);
            ...
        }
    }

    public void Operation2()
    {
        using (IYourContext context = _factory.Create()) 
        {
            RepositoryA repository = new RepositoryA(context);
            RepositoryB repository = new RepositoryB(context);
            ...
        }
    }
}

これは、コンテキスト用にファクトリを渡す例でしたが、必要に応じてリポジトリに対しても同じことができます。

于 2011-08-18T19:28:37.290 に答える