2011-10-27 12 views
0

私たちは、BLLとDALで構成されるモデルを持つMVCアーキテクチャを使用します。デザイン - 依存性地獄ソリューション?

私たちは私たちのシステムのための "モジュール"を開発しています。私が実装している特定のモジュールは、同じ依存関係の多くを利用しています。あるクラスは特に20の依存関係を持っています。現在デフォルトのコンストラクタは既定の具象実装を作成しており、最初のコンストラクタもあります。最初のコンストラクタは独自の依存関係(つまりテスト用)を注入できるようにします。

コンストラクタ引数はかなり厄介なようですコード臭。 もう1つの厄介な点は、共通の機能を追加し始めたときに、同じクラスのコードを何度も何度も繰り返しているすべてのクラスにコンストラクタコードとフィールドを追加する必要があることです。

IoCコンテナはこれに対する自然な解決策のようですが、問題はどれくらいですか? DAL依存関係とBLL依存関係は含めることができますか? "ヘルパー"や "サービス"の依存関係はどうですか?ある時点で、静的なクラスのようなクラスを参照する能力を持つ「名前空間」構造を作り直しているところで、私は実際に何を得ているのか疑問に思っています。

私はこれを考えて問題を抱えています。誰もエレガントなソリューションやアドバイスを持っていますか?

+0

「これで考えるのが難しい」このチュートリアルを確認してください:https://github.com/ninject/ninject/wiki –

+2

接線関連:ここでは、クラスが取る依存関係の数を減らすための別の質問について書いた答えがあります。 http://stackoverflow.com/questions/5601920/what-are-your-best-practices-when-using-an-mvc-based-web-framework/5602212#5602212 – Domenic

答えて

7

IoCルート(私がお勧めします)に行く場合は、すべての依存関係をコンテナに含めます。

多くのレイヤーが深い場合でも、それらの依存関係を作成する心配はありません。

たとえば、ClassAはコンストラクタ内で他の4つのクラスを取り込み、それぞれが2つのクラスを取り込み、それぞれが少なくとも1つのDAL参照を取ります。

その場合、ユーザーのUIとなる可能性のある最上位レイヤー(「構成ルート」)のIoCを参照するだけで、「オブジェクトAのインスタンスを教えてください。 IoCは、オブジェクトグラフを構築するのに必要な様々な依存関係に対して、他の20個のインスタンスを自動的にインスタンス化します。

クラスは、依存関係を作成する方法を心配する必要がなくなりました。コンストラクタに貼り付けるだけのものが必要な場合は、IoCを確実に取得します。

IoCを使用していても、1つのクラスの20の依存関係が明確なコードの匂いであるとも言います。これは通常、クラスがあまりにも多くの処理をしており、単一責任原則に違反していることを示します。

+0

+1 - IoCが明白であることに強く同意する(MVCの言い訳を言い訳してください)また、あなたの用語を「自動的に」使用するためのルートです。 – Reddog

+3

+1はSRPの違反の言及のために。間違いなくデザインを見て良いアイデア。 –