2

この質問は以前にも答えられているように見えるかもしれませんが、答えはケースごとに異なると感じているため、いくつかの投稿を読んだ後、私のアーキテクチャに最適なケースはわかりません。

このコンポーネントを実装するすべてのアプリケーションで利用できるデータ モデルと基本機能を備えたコンポーネント ライブラリがあります。

このコンポーネントには、ディスクからファイルをロードして処理するインターフェイス IReader と、データベース アクセスと CRUD 操作を提供する IDataMapper を持つ境界があります。オブジェクトを比較するための IObjectComparison、XML シリアル化のための IXMLSerialization などの特定の機能のための他のいくつかのインターフェイス。

これらのインターフェイスの定義をどこに保存すればよいかわかりません。

オプションは次のとおりです。

1)- コア ライブラリ内で、実装を作成するときに、このコア コンポーネント内に実装ライブラリを含める必要があります。実装から切り離して維持したいと考えています。

2)- 別のライブラリ プロジェクト (アセンブリ)。そこにあるすべてのインターフェースは、コアコンポーネントに含まれ、実装ライブラリに含まれています。

3) - 実装ライブラリでは、コア コンポーネントに実装ライブラリを含める必要があります。

合理的に分離されていると思われる唯一のケースは、すべてのインターフェイスを別のアセンブリ ライブラリに配置した場合です。コア コンポーネントには、必要な実装が含まれています。

最良の選択肢の長所と短所は何だと思いますか? 私が達成したいのは、分離されたアーキテクチャだけです。

だから私がするとき

コンストラクタ:

CoreComponent(IReader Reader, IDataMapper Mapper)

new CoreComponent(WindowsReader, SQLServerMapper)

WindowsReaderまたはSQLServerMapperをコア コンポーネントに含める必要はありません。

乾杯。

4

1 に答える 1

3

オプション 1 - Core Library を選択します。これは、DDDでの方法に準拠しているためです。DDD では、DAL やその他のそのような層ではなく、ドメイン層に IRepository インターフェイスを配置していました。

ウィキペディアが言うように、 DIPは、より高いレベルのコンポーネントがインターフェースを所有すると言います...

ここで、高レベル コンポーネントが必要とする動作/サービスを定義するインターフェイスは、高レベル コンポーネントのパッケージによって所有され、そのパッケージ内に存在します。

これは最も一般的な方法ですが、厳密な規則ではありません。

オプション 2 は問題ありませんが、他のプロジェクトで 2 つの DLL を参照する必要がありますが、オプション 1 では 1 つの参照のみが必要です。選択肢 3 は適切ではありません。

それが役立つことを願っています。ありがとう。

于 2014-07-16T13:52:47.817 に答える