質問

私は LINQ to SQL を使用する個人プロジェクト (C# / ASP.NET) に取り組んでいます。ソリューションには (これまでのところ) Webform プロジェクト、Namespace プロジェクト (ビジネス ロジック)、および Tests プロジェクトがあります。私は今のところ非常に初期段階にいます (明らかに設計段階にあります)。

ここに 3 層アーキテクチャのパラダイムはありますか?この場合、DAL はまったく役に立たないようです。ビジネス ロジックから LINQ クエリを直接実行する必要があるように感じます。

また、常駐 DataContext を 1 つだけ保持してそれを渡す場合、開いている接続は 1 つだけ必要になることも思いつきました。これには、変更を細かくではなく一度にコミットできるという追加の利点があります。それについて何か考えはありますか?

見つけました このスレッド, 、しかし、それは不完全な絵を描いているようです。このテーマに関する詳細な記事はありますか?

役に立ちましたか?

解決

あなたはとても「直接ビジネスロジックから」それを使用することは必ずしも悪いことではありません、あなたのDALとしてLINQツーSQLを考えることができます。

<のhref = "http://dotnetlog.com/archive/2008/03/18/best-practice-and-effective-way-of-using-datacontext-in-linq.aspx" のrel = "nofollowをnoreferrer "> http://dotnetlog.com/archive/2008/03/18/best-practice-and-effective-way-of-using-datacontext-in-linq.aspx には記載されているいくつかの人気のあるL2Sのアプローチがありますます。

私たちのプロジェクトでは、我々は上記のリンク(周囲のDataContext、下記参照)から#3と同様のパターンを使用してデータコンテキストの周囲を通過したくありませんでした。これは、いくつかの問題があったが、それが合理的にうまく機能しました。弊社のWebプロジェクトのための少なくともます。

  

周囲のDataContext(現在はこれを使用して)

     

周囲のDataContextの背後にある考え方は、DataContextのための最初の呼び出しがあるように、そのコンテキストとすぐ特定のスレッドまたは(asp.netで)のHttpContextのために作成されています。それは手動で配置されていない限り、同じコンテキストは、そのスレッドまたは要求のために使用されます。これは、要求/スレッドデータストアにコンテキストを格納することによって行われます。このパターンへのアプローチは、静的のDataContextが、しかし、分離は各スレッドと要求するために設けられていると同様です。これはAsp.Netに本当によく働く、しかし、再び静的コンテキストの問題のいくつかに悩まされています。

     

このパターンの問題ます:

* The context is available for manipulation at any level. And quickly becomes very hard to maintain unit of work
* Portability across thread is very hard
* Unit of work pattern is not transparent enough

他のヒント

あなたは、ドメイン駆動設計上のビットを読み取ることができます。

あなたが取り組むたい問題領域を表現する場所でドメイン駆動設計(DDD)、あなたは、豊かな「ドメインモデル」を持っているの練習で。 このドメインモデルは、あなたのビジネスエンティティをモデル化されて、クラス(および構造体)で構成されています。 ドメインモデルはまた、リポジトリのconsits。
リポジトリは、あなたのドメインモデル(およびアプリケーション内)で使用抽象化のいくつかの種類です。リポジトリは、データストアを抽象化したものです。リポジトリを通じて、あなたはエンティティを取得することができ、あなたはエンティティを永続化するリポジトリを使用することができます。

あなたのケースでは、あなたのリポジトリは、データベースと対話するために内部的にLINQ to SQLのを使用することができます。 (オープン/クローズ)接続とトランザクションはいえ(開始/コミット/ロールバック)リポジトリを管理するために責任があるべきではないこと、しかし、注意してください。 どうして ? - >リポジトリは、それが使用される文脈の知識又は概念を持っていないからです。それはあなたのアプリケーションやサービス層の新しい接続を開き、開始/トランザクションをコミットするための責任を負わなければならない(ドメインモデル、したがって、あなたのリポジトリを使用する層)です。 (または、あなたのケースでは、新しいのDataContextを開きます)。 その後、リポジトリにDataContextのを渡すことができます。

(エリック・エヴァンスは、随時、クラックするのは難しいナットはいえ、DDDに関する素晴らしい本を持っている)。

あなたはあなたの用語を注意する必要があります。あなたはLINQを言うときあなたは通常、あなたは3台の別のマシンで展開シナリオについて話していること、3層を言うとき、あなたは、LINQのツーSQLを意味します。私はそれはあなたが何を意味するかであるかはわからない。

LINQツーSQLのようなORMツールを使用している場合、

3層アーキテクチャはまだ良いアイデアです。 DALは、クエリのロジックを格納するだけの場所となります。クエリは永続化の懸念ではなく、ビジネスロジックの問題ですので、あなたのビジネス層のうち、あなたのクエリを取るために、その良いアイデアます。

データコンテキストを管理するための通常の技術が要求ごとに単一のデータコンテキストを持つことです。

あなたが任意のORMツールのいずれかのアーキテクチャガイダンスで見ることができ、被写体上の他の記事の観点から - LINQのツーSQLは違いはありません。 NHibernateのためのアーキテクチャに関する記事を探します。

この場合、LINQ to SQL ライブラリが DAL となり、ビジネス層から従来の API 呼び出しを行う代わりに (例:DAL.GetObjectById(id)) を使用すると、より表現力豊かな要求を DAL に柔軟に送信できます。

他のニーズがある場合 (MSSQL 以外のデータ バッキングに接続する独自の LINQ プロバイダーなど)、独自の DAL を実装することになります。

さらに、DataContext に関しては、「1 つの常駐 DataContext」でシングルトン パターンを使用することはお勧めできません。DataContext オブジェクトは、アプリケーションにとってどのような意味があるとしても、単一の論理トランザクションを表す必要があります。(からの意訳) http://weblogs.asp.net/despos/archive/2008/03/19/more-on-datacontext-in-hopefull-a-realistic-world.aspx)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top