私は、NerddinnerとContactManagerのようなよりシンプルなアプリケーションだけでなく、Kiggのようなもっと複雑なアプリケーションも見てきました。私は単純なものを理解していますが、今はより複雑なものを理解したいと思います。私のMVCを次のレベルに引き上げる:DIと作業単位
通常、単純なアプリケーションの場合、LINQtoSQLまたはEntity Frameworkの上に、リポジトリクラスとインターフェイス(取得できるように疎結合)があります。リポジトリは、必要なデータ操作を行うためにコントローラから呼び出されます。
私はKiggまたはOxiteのような、より複雑なアプリケーションを調べるときに私が見る一つの一般的なパターンは、(私はここに、表面に傷をつけていますが、私はどこかに起動する必要があります)の導入である:
- IOC DI(Kiggの中ケースここで働い
のユニティ)
本当に疎結合されたアプリケーションを実際に使用するには、Unityのようなものを使用する必要があることを理解しています。しかし、Unityにミックスを導入した瞬間も、Web Request Lifetime Managerを導入する必要があります。何故ですか? NerddinnerのようなサンプルアプリケーションにWeb Request Lifetime Managerがないのはなぜですか?それは正確に何をしますか?ユニティ特有のものですか?
第2のパターンは、作業単位(Unit of Work)の導入です。再度、同じ質問:なぜNerddinnerまたはContactManagerはUnit of Workを使用しないのですか?代わりに、これらのアプリケーションは、Linq2SqlまたはEntity Framework上のリポジトリクラスを使用してデータ操作を行います。作業部会の兆候はありません。それは正確に何であり、なぜそれを使うべきなのでしょうか?
おかげ以下
はDinnersControllerレベルでNerddinerにDIの例である:
public DinnersController()
: this(new DinnerRepository()) {
}
public DinnersController(IDinnerRepository repository) {
dinnerRepository = repository;
}
は、だから私は右のために最初のコンストラクタのコントローラはDinnerRepositoryし、それを「所有」することを前提としていますしたがって、コントローラが宣言されて以来、コントローラの寿命に依存しますか?
ありがとうございました!それが助けになりました。私は質問を編集しました。これはコントローラがリポジトリ/データコンテキストへの参照を所有していると言ったときの意味ですか? – Thomas
正確ではありません。 NerdDinnerでは、ユニットテストを容易にするためにIDinnerRepositoryを受け入れる追加のコンストラクタを使用します。しかし、それはまだコントローラ(パラメータのないコンストラクタ)またはリポジトリオブジェクトを作成して所有するテストのいずれかです。彼らは死んでも、リポジトリの他のユーザもいません。生涯は簡単です。ところで、そのような技術は悪いです。あなたはそれについてもっとここで読むことができます:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx(同様に「貧しい人のIoC」の場合はgoogle)。 – queen3
ジミー・ボガードの「貧しい男のIoC」の荒々しい例であるという議論は、ここでは非常に良いです。コメントも良いです。間違いなく読む価値がある。 –