0

作業単位パターンについては非常に多くの情報が入手可能ですが、それらのほとんどは異なります。

リクエストごとに独自のエンティティ コンテキストが必要であることを学びました。そして、この目標を達成するには Unit of Work パターンを使用する必要があります (ここから。Entity Framework and Connection Pooling )

だから私はそれをこのように正確に実装しました:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work- asp-net-mvc-application のパターン

しかし、その実装だけでは、リクエストごとに 1 つのコンテキストはありません。すべてのリクエストが同じコンテキストを共有していますよね?

次に、このリンクを見つけました: http://www.mindscapehq.com/blog/index.php/2008/05/12/using-the-unit-of-work-per-request-pattern-in-aspnet-mvc/

しかし、セッション / HttpContext.Items 変数にコンテキストを保持するべきではないことを思い出しました。そうですか?

最適な実装のチュートリアルはどこにありますか?

4

1 に答える 1

2

2番目のリンクにあるパターンに従います。そのパターンを持つすべてのリクエストでコンテキストを共有していません。サンプルコードを見てください:

public class StudentController : Controller
{
    private IStudentRepository studentRepository;

    public StudentController()
    {
        this.studentRepository = new StudentRepository(new SchoolContext());
    }
}

コントローラへのリクエストごとにStudent、そのクラスの新しいインスタンスが作成されます。そのクラスのコンストラクターでは、新しいコンテキストで新しいリポジトリ インスタンスを作成しています。つまり、コンテキストはそのリクエストの存続期間中のみ存続します。

編集:もう少し明確にします:

たぶん、プロセスを後退させると明確になるでしょう。訪問者がコントローラーで何らかのアクションを実行するところから始めます。ASP.NET は、コントローラー クラスのインスタンスを作成します。そのインスタンスを作成すると、そのリクエストの期間中存続するコンテキストがメモリ内に作成されます。

コントローラー内で作業を実行しているため、これは問題なく機能します。たとえば、ユーザーが自分のプロファイルを更新するように依頼したとします。Entity Framework (EF) でそれをどのように処理しますか? まず、リポジトリを使用してユーザー レコードをフェッチします。コンテキストはそのオブジェクトを認識しています。次に、訪問者が提供したデータ (電話番号を変更したいとします) を取得し、新しい値で EF オブジェクトを更新します。コンテキストはこれらの変更を追跡しているため、アクションの最後に呼び出すことができ.Save()、データベースに対して適切な更新が行われます。

于 2013-04-16T15:19:07.233 に答える