2011-06-19 39 views
2

JAVA用のSpring MVCで作業していたので、Hibernate DAOとうまく機能するサービスレイヤーに@Transactionalビヘイビアを適用することに慣れてきました。 LINQ to SQL ORMに基づいたプロジェクトで同様の問題に直面しているので、すべてのトランザクションがDAO内で行われていることがわかります(DC DC = new DC(){dc.submitChanges() }ASP.NET MVCで@Transactional in ASP.NET MVC

どのようにしてのDAOからトランザクションロジックを削除して、ASP.NET MVC LINQ2SQLプロジェクトにおけるサービス層にそれを持っていますか?

はありがとう。

答えて

2

Spring MVCのは、HibernateのSessionSessionFactoryを持っていたので、それは途方も働いていました登録し、トランザクションの作成とコミットを処理します。.NETでも同様に行うことができますが、自分で行う必要があります。 Spring MVCのようなツールはJavaに提供します。通常、手動で作成するのではなく、DataContextインスタンスをサービスレイヤに挿入する必要があります。

サービスレイヤーとは何ですか?私の場合、サービス層はモデルです。そのような場合は、ほとんどがASP.NET MVCの外にあります。ASP.NET MVC(custom filters)でコントローラのアクションの属性を作成する方法がありますが、これはサービスレイヤではありません。サービス層のカスタムトランザクション属性が必要な場合は、主にAspect oriented programming(AOP)を意味します。

あなたの選択は何ですか? Windsor Castle、Spring.NET、Unity 2.0などのAOPをサポートする優れたIoCコンテナを選択するか、AOP用にPostSharpを使用します。トランザクションAOP属性を作成する簡単な方法は、注釈付きメソッドが実行される前にTransactionScopeを作成し、注釈付きメソッドが実行された後にCompleteスコープを作成するだけです。しかし、あなたがまだDataContextインスタンスを作成してSubmitChangesを呼び出さなければならないので、それはあなたが望むものではありません。 DataContextインスタンスをどこかに格納し、注釈付きメソッドを実行するAOP属性が必要です。このメソッドは、ストアド・コンテキスト・インスタンスをロードして使用できます。メソッドが終了すると、AOP属性はSubmitChangesを呼び出します。唯一の問題は、コンテキストインスタンスを格納する場所とそれを取得する方法です。Spring MVCはSpringを内部的に使用し、インフラストラクチャ全体を提供すると考えていますが、.NETではWebアプリケーションの場合は記述する必要があります。コンテキストをHttpContext.Itemsに格納する必要があります。

+0

私の文脈では、service-layerは、DAOの削除、削除結合などで一連のメソッドをトリガーしなければならないメソッドAPIを提供します。 JavaでのPOJO)。サービス層は私の文脈でコントローラのセットではなく、むしろコントローラによって使用されるビジネスロジックの抽象である。サービスは、特定のDAO応答をキャッシュし、繰り返しのデータクエリなどの最適化を提供することを選択することがあります。IoCのためにStructureMapを使用します。 – alexm

+0

同じ答えが有効です。あなたは属性/注釈を持ちますか?次に、StructureMapがinterception/AOPを介してこれをサポートしているかどうかを確認します。属性なしで暮らすことができる場合は、サービスレイヤ操作でコンテキストを作成し、それをDAOに渡します。すべてのDAOが作業を完了すると、サービス操作の変更が送信されます。 –

+0

ありがとうございます。 – alexm