5

最近、私はEntityFrameworkを探索するとともに、リポジトリパターンとUnitOfWorkの概念を掘り下げ始めました。

MVCの例に基づいて独自の実装を作成しました。ここでは、UnitOfWorkをコントローラーから次のように破棄していました。

protected override void Dispose(bool disposing)
{
    unitOfWork.Dispose(); 
    base.Dispose(disposing);
}

私はMVCにはまったく興味がなく、Webformsでもかなり新しいですが、UnitOfWorkを他の「すべて」が破棄されるように破棄するために、Controllerdisposeメソッドをオーバーライドしていると思います。

基本的に、ASP.NET WebForms Webサイトに同じ概念を実装し、ページのコードの背後で使用されるUnitOfWorkを、ページ自体の破棄と一緒に破棄したいと思います。

ライフサイクルからPage_Unloadイベントに同じものを追加することを検討しましたが、これまでそのようなことをいじったことがないため、これが適切な方法であるかどうかはわかりませんでした。私の考えは次のとおりです。

protected void Page_Unload(object sender, EventArgs e)
{
    unitOfWork.Dispose();
    base.Dispose();
}

どうすればそれを安全に達成できますか、そして私は正しい軌道に乗っていますか?

4

2 に答える 2

3

まず第一に:車輪を発明しないでください。

StructureMap、Ninject、Unityなどの依存性注入フレームワークを使用します。

UoWは、 Webリクエストの開始から開始し、リクエストが終了しときに破棄する必要があります。

つまり、リクエストの開始時にEFのDataContextを初期化する必要があります。次に、それをどこかに保存して(Session、...)、その要求に再利用できます。リクエストごとにDataContextの1つのインスタンス。

しかし、自分でやろうとすると、依存性注入フレームワークを使用すると、それがとても簡単になるという間違った方法になります。

フレームワークは、DataContext(UoW)の存続期間を処理できます。

于 2012-06-27T14:51:38.860 に答える
1

ソフトウェアをレイヤーとコンポーネントに分割する必要があります...

UI->コントローラー->サービス->DAL

例えば

UI.Submit-> Controller.SaveUserInfo-> UsersManagementService.SaveUserInfo->

public void SaveUserInfo(User user)
{
    using (var uow = new Uow())
    {
        var dbUser = uow.Users.GetByKey(user.Id);
        if (dbUser == null)
        {
            // TODO:
        }

        dbUser.Name = user.Name;
        dbUser.Address = user.Address;
        // Or use a framework for injecting properties

        uow.SaveAndAcceptChanges();
    }
}

certiainサービスメソッドでクエリロジックを受け取ることもできます。

public User GetUsersMatching(Func<IQueryable<User>, IQueryable<User>> query)
{
    using (var uow = new Uow())
    {
        var users = query(uow.Users).ToList();
        return users;

        // For this to work using POCOs you may need to disable proxy creation
    }
}

ただし、これによりテストがより複雑になり、サービスの利用者はLINQtoEntitiesの制限とベストプラクティスを理解する必要があります。

また、ベースタイプごとの純粋なアカデミックリポジトリパターンを使用しないことをお勧めします。同じドメインからのさまざまなタイプのデータを効率的に使用するには、クロス「リポジトリ」クエリとLINQの句が必要であるか、複数のクエリの結果が一緒に組み合わせて形を変えてから、1つのきれいな結果として返します。join

代わりに、サービスをさまざまなタイプの出力を取得できるdomain-speicifc-repositoriesとして扱います。つまり、MVCの下でEFの上にSOAを使用します。

于 2012-06-29T11:49:25.100 に答える