2009-05-26 12 views
8

プロフェッショナルASP.NET MVC 1.0の第11章(テスト可能なデザインパターン)を読んできました。この章の例では、データアクセスはIOrderRepository、IProductRepositoryなどの多くのリポジトリに分割されています。すべての意味があります:単一のクラスのデータに対する単一のリポジトリ。LINQを使用した複数リポジトリまたは単一リポジトリ

しかし、テーブル間のリンクを考慮すると、これは私のために多少分解されます。注文には数多くの製品が含まれています。 OrderクラスがLINQ-to-SQLによって作成されると、オーダークラスには、そのオーダーに関連するすべての製品を列挙するProductsコレクションがあります。このコレクションを使用することで、ProductsRepositoryをバイパスします。

したがって、私は、私はOrderRepositoryとProductRepositoryをモックする必要があるだけでなく、私はまた、返されたOrderオブジェクトのProductsコレクションに値を設定する必要があります。これは、嘲笑されたOrderRepositoryが模倣されたProductsRepositoryなどについて知っていなければならないことを意味します。

LINQが親切に私のために作成したこれらのコレクションを無視するのは無駄に思えるので、私の質問は、この場合、単一のリポジトリが理にかなっていませんか?

答えて

1

その他の要因は、製品の可能性が寿命と寿命の任意の時点でいくつかの他のO/RマッパーにLINQツーSQLから変更することの可能性を含め検討します。プロジェクトが小さくなればなるほど、製品の重要度が低くなるほど、第n次までの重要度を抽象化する心配が少なくなります。

12

あなたの問題の説明は、「これは良い、それは悪い」というあまりにも多くのblablaが、手元の問題を見てソフトウェアを作成するのではなく、作成された方法でソフトウェアを作成する理由その問題を解決する。

問題点の説明は問題解決の問題ではありません。クライアント用に作成するアプリケーションがあります。解決すべき問題です。あなたの選択肢があなたの人生を困難にするならば、それらを蹴飛ばして、何が効いているのかを使ってください。嘲笑がうまくいかない場合は、どうして迷惑でしょうか?ああ、誰かがあなたのソフトウェアは、あなたが嘲笑しない場合は吸うと言ったので?どうして?

ここではいくつかのDDDのものを拾いましたが、重要な部分が欠落しています。製品は集約ルートです。つまり、独自のリポジトリから製品を入手する必要があります。はい、それはモデルのナビゲーション機能を緩和しますが、それはEvansの本の第2部分がどのように指示しているかを厳密にリポジトリを作成する場合、あなたのためのDDDです。しかし...あなたはすべきですか?

Productに独自のリポジトリがあるが、注文からの製品にナビゲートすることができない理由に答えることができない場合は、集約ルートのレポジトリを作成しないでください。なぜそのリポジトリはありますか?それがあれば、製品が入手できるのは唯一のポイントではないでしょうか? (怠惰な読み込みでもそうではありません!)。

これは実際には必要ない(おそらく皮肉なことに、YAGNIが最大限の効果を発揮する)大量のオーバーヘッドとコードを作成します。

DDDはすべて約と考えているです。したがって、ドメインは設計を推進し、それを実践することによって、現実を表すドメインモデルを取得します。それはあなたがどこかで読んだだけなので、たくさんのコードを実装するべきだと言っているわけではありません。代わりに、ドメイン要素、集約ルーツなどを認識している場合は、これらの型の動作をどこかに配置する必要があります。ドメインクラスの内部オーダー・リポジトリー内の受注指向フェッチ・ロジックのような別のクラスにフェッチ・ロジックを置くことはできますが、厳密な意味でのリポジトリーではありません(例えば独自のローカル・キャッシュなどはありません)。それはそれほど悪くはありません、それはあなたのクライアントのために作成する必要がありますすべてについてです。

だから、まず考えてみてください。考えてみてください。そして、考えてみてください。あなたのために論理的に思われるもの。あなたが持っているオプションの長所/短所のリストを作成し、あなたに一番合ったものを選んでください。その選択肢とその理由を文書化し、その選択肢を選択したのはなぜですか?これは他のどのソースよりも保守者にとってより価値のあるものです。代替案とそれを選んだ理由を文書化し、あなたのために何がうまくいくかを調査し、あなたが選択したものを選択します。

ソフトウェア工学は、それが適切な推論 1は、そのようにするだろう、なぜとされていない他の方法でなくて、今日では単に最初に行うと、後で考えるようにファッション思えるだけのことだ、難しいことではありません。

幸運:)

+0

ありがとうございます。 「思考」については、これが私がやっていることなので、先に進む前に意見を聞いたのです!私はこのパターンに慣れていないし、より多くの経験を持つ人からいくつかの洞察を期待しています。もう一度乾杯。 – Grokys

+0

はい、申し訳ありません。質問の最後の段落は、実際にあなたがしていたことが本当に役に立たなかったことを理解したことを示唆しています。次回は、コードを書く前にそのプロセスを適用しようと思っています;)(おそらくあなたがどのように働いているかから離れているかもしれないので)既に書かれたコードを投げる必要はありません。 –

+0

この回答のぞっとする部分は、私が今までに読んだことの中で最高のものでした!あまりにも多くの "あなたはこれを行う必要があります/それ"と、誰かを読むために新鮮な山の空気の呼吸は、 "あなたの解決策のために働く"と言うことです。 – Remotec

関連する問題