質問

階層化アーキテクチャでは理論的には同じ層に複数のモジュールを持つことができます。このモジュールは、相互に参照を横断することはできますか?である例えば、技術的には可能です。 .NETを使用していますか?

役に立ちましたか?

解決

ちょうど、モジュール間の任意の循環依存関係を導入しないように注意してください、そうすることは確かに可能です。一般的に、所定の層におけるモジュールは、同じ層から、またはその下の層から他のモジュールに依存しなければなりません。モジュールは、その上の層を意識するべきではありません。

あなたは、これはさらに厳しいようにしたい場合は、

、あなたもすぐに現在の下に、同じまたは他の層から他のモジュールへの依存関係を制限することができます。

例えば、最小に露出インターフェースを維持パブリックインターフェース、値オブジェクト、および例外の唯一のコアセットを露出させることは常に良い考えです。あなたが他の層にこぼれるから、モジュール内部の可視性を制限するために、言語のアクセス制御機能(すなわち、プライベート/パッケージ/パブリック)を使用することができます。

他のヒント

技術的にはあなたが.NETにしたい任意の方向に参照を横断することができます(それは良い考えではないかもしれないにもかかわらず、UIコンポーネントを参照するDALのための技術的な制限がありません)。私は同じ層内のモジュールを参照すると何の問題も見られない。

しかし、我々は層が異なる形およびサイズ入って来ているので、単語「層」ビットを見てする必要があります。私たちは言葉「層」を使用する場合、多くの場合、我々は、データアクセス層やプレゼンテーション層を考えると、我々は一般的に層が下向きではなくupwarsを見ることができます。

各層内に、異なるモジュールは、多くの場合も、論理的に、それ自体を層に配置することができます。同じルールがここに適用されます。モジュールはダウンではなく、調べることができます。このことを念頭に置いてそれは同じ(外側)層内のモジュールを参照するためにかなり安全な感じています。

ただ、直接的または間接的に、二つのモジュールが互いを参照していません。あなたがAを見つけるとBの両方が、互いに機能が必要な場合、おそらく、おそらく新しいモジュールCを導入し、コードをリファクタリングする必要があります(AとBが同じレベルにあることを示す)、論理的にAとBの両方の下方に配置されそれらを使用することができます。

また、できるだけ外してモジュールを保つために覚えておいてください。それほど彼らはお互いを知って、より良います。

パベルが言ったように、あなたの循環依存関係に注意してください。あなたは絶対に循環依存(あなたがクロスリファレンス呼んでいるもの)なしでは生きられない場合は、クラスが同じ「層」が、また、同じアセンブリからだけではなく、である必要があります。

言われ、相互参照するための理由があってはならないこと - べき(パベルが言ったように)だけでなく、モジュールは、一方向依存性は、すべての場合に存在する必要があることを、その下の層に依存する

このルールにはいくつかの論理的な例外がありますが、ドメインモデルのようなもので、たとえば - 顧客が注文の数を持っているだろう、と言います。顧客に注文のリスト、および各注文から顧客への参照を持っている(ESPのORMなどで)そのような場合に有用であるかもしれません。サービスなどのような機能の単位の面では、一方向だけの依存関係があるはずです。

は、この問題を回避する一つの方法は、あなたがアセンブリ内のインターフェースとそのインターフェースの具体的な実装を消費し、別のオブジェクトを定義することができますウィンザー、autofac、spring.netなどを通じて制御の反転を使用することです。別のライブラリーは、(アセンブリ第1のアセンブリを参照しなければならないことを意味する)実際の実装が含まれている場合があります。この場合には、IoCコンテナを実装グラブ。

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