2009-05-17 4 views
6

LINQ to SQLは大好きですが、リポジトリコードはLINQ to SQLフレームワークによって生成され、SQL Serverデータベースに密接に結合されてしまいました。LINQ to SQLを使用する際に、パーシスタンスコードをどのように抽象化しますか?

LINQ to SQLを抽象的で疎結合に使用している人はいますか?もしそうなら、どのようにしてコードデータベースに依存しない問題にアプローチしましたか?

答えて

3

自分用。私はLINQ/dbmlが生成するオブジェクトモデルを再利用することに満足しています。なぜなら実際には属性が私を傷つけることはなく、他の実装でも同様のモデルを提供できるからです。しかし、私は自分のデータコンテキストDALの外側にある。だから私は、のようなものがあります:

  • IFooRepositoryを - データ・コンテキストを知っている実装

マイ - 生成DBMLオブジェクトといくつかのPOCOモデルクラス

  • FooRepositoryの両方を使用して、使用可能なメソッドを定義しますリポジトリメソッドはIQueryable<T>Expression<...>のようなLINQの概念を公開しません。なぜなら、それらはleaky abstractionsです。他の実装は異なって動作します(例えば、EFは両方の異なる側面をサポートします)。

    さらに、ほとんどの関連付けプロパティを内部としてマークし、DALクエリ中にのみ使用しました(OO作業中はそうではありません)。

    私は純粋なPOCOにマップすることができましたが、私は利益を見ません。私はここでこれについていくつかの考えを持っています:Pragmatic LINQ

  • +0

    Marc、nice blog post。 +1 –

    1

    NerdsDinnerで使用されているのと同様の方法を使用できます。このプロジェクトは、datをデータベースへのゲートウェイとして使用し、その周りにリポジトリを構築します。

    この種のリポジトリパターンは、呼び出されたメソッドに従っていくつかの条件、フィルタ、ソートコマンドなどを追加して、呼び出し元にIQuerableを返して、さらなる変更を行うためにドアを開いたままにします。

    実際には、NHibernateのセッションの周りにリポジトリを構築するときとほとんど同じ方法で行います。

    たとえば、LinqtoSqlをNHibernateに置き換えると決めた場合は、datacontextの代わりにLinqセッションをリポジトリ内で照会するだけです。もちろん、LinqtoSqlが自動的に追加するプロパティを使って部分クラスを完成させることは必要です。

    -1

    ムークのせかいりょこうは上記NerdsDinnerでリポジトリパターンを言及し、すぐにここでそれを設定する方法のチュートリアルもあります:

    http://www.asp.net/learn/mvc/tutorial-10-cs.aspx

    このNerdsDinner前にリリースされたチュートリアルの良い小さなシリーズ。ここのコンセプトは、従来のasp.net Webフォームアプリでも設定できます。 http://www.asp.net/learn/mvc/tutorial-16-cs.aspx

    0

    ちょっとネイサン、良い質問:

    また、私の代わりに、上のいくつかの基本はここにあるエンティティ(新しい、および他のDBのためのより多くのサポート)へのLINQを使用してお勧めします。

    他の人が言ったように

    は、行うための最善のことは、すべてのあなたのGET/WRITE法抽象的であり、あなたのビジネスロジックから完全にDataContextを離れて非表示にします。これに

    私のアプローチが必要であるものは何でもやるためにリフレクションを使用する一般的な方法の束とDALを書くことでした。これらの事例では

    、メソッドは、オブジェクトを受信すると、それはそれはあなたの内部で独立した/データアクセステクノロジをORM望んでいるものは何でもすることができ、「製品」と言うこと。あなたが望むのであれば、文字通り、いくつかのパラメータとオブジェクトの反映に基づいてSQL文字列を書くことができます。

    ここではを単独で実行しても、LINQからSQLに完全に結びつくわけではありません。

    問題は本当にエンティティ自体です。データを取得するためのメソッドを抽象化しても、それらのEntitesをビジネスロジック全体に使用しています。

    私は、私自身の接続していないエンティティを書き直すことは、私がまだ交差する準備ができていないように思えるので、私は生きる準備ができています。不必要な多くの作業...

    私は他の人がこのかかわらに取り組む方法を確認するために非常に興味があると思います。

    乾杯!

    +0

    それも私の主な問題です。おそらくエンティティはインタフェースとして抽出できますか?そうすれば、通常どおりLINQ to SQLを使用してデザインを制御し、インターフェイス抽出などのコード生成の利点を得ることができます。 –

    +0

    ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええん、SQLを使ってクラスを生成する、そして、あなたのコードでは、LINQ to SQLに解かれた独自のClassesを使用しますが、それぞれのLINQ to SQLクラスに一致するインターフェイスを実装しますか?それは正しい?私はあなたがこれと一緒に行くところ、それはかなりクールなアイデアを見ることができます。私が細部を確信していますが、多分あなたは明確にすることができますか?私の唯一の懸念は、あなたはまだ余分な(?)コードを書く必要があるということですか?また、今私はそれについて考えて、遅い拘束とエンティティの関係を失うだろう...あなたはどう思いますか? – andy

    +0

    ビジネスロジックとプレゼンテーションコードのすべてがインタフェースを介してエンティティを参照していた場合、必要に応じて生成されたエンティティを完全に削除し、すべてのlinqコードをリポジトリ内に保持し、生成されたエンティティがインターフェイスを「実装」するようにします。私たちがしなければならないことは、resharperなどを使って、公開されているエンティティのすべてのメンバーをインターフェースに押し上げることです。そうすれば、インターフェースを更新したままにする以外に書くことができる余分なコードはほとんどありません。 –

    関連する問題