1

たとえば、次のアセンブリに分離された単純な ASP.NET MVC ソリューションなど、疎結合レイヤーを実装し、IoC コンテナーなどを実装することで、SoC の原則に準拠することになっているコード プロジェクトがあるとします。

  • アプリケーションアセンブリ + 名前空間
  • モデルアセンブリ + 名前空間 (DB データにアクセスするための具体的なリポジトリが含まれています)

また、モデルアセンブリの具体的なリポジトリが共通のインターフェイスを実装する必要IMyBusinessRepositoryがある場合、そのインターフェイスをどのアセンブリに配置しますか?

1) そのインターフェイスをモデルアセンブリに配置すると、アプリケーションアセンブリのコードを変更せずに、そのアセンブリを別のアセンブリに置き換えることは不可能になる可能性があります (少なくとも名前空間が異なる場合) 。また、別のアセンブリに存在する代替 IMyBusinessRepository実装は、元のアセンブリを参照する必要があります (うわあ!)

2) アプリケーション アセンブリに配置すると、アプリケーションアセンブリを参照せずに他のプロジェクトでモデルアセンブリを使用することはできなくなります(うわぁ!)

3) または、そのインターフェイス専用の共通アセンブリを個別に作成しますか?さらに言えば、共通インターフェイスまたはインターフェイスのセットごとに個別の共通アセンブリを作成しますか? (うーん?)

要約すると、Xアセンブリは、アプリケーションAで(参照を変更するだけで) 簡単に置き換え可能であり、アプリケーションBCDで再利用できる必要があります。

4

4 に答える 4

2

オプション3。

インターフェイス定義を呼び出し元のコードに含めることは、インターフェイスに対して開発するが、それを保持するコンポーネントではない場合までは問題ありません(たとえば、データアクセスプロバイダーを構築したいが、Webサイト全体を取得したくない場合事業)。実装でそれを置くことはただクレイジーな話です:)

そのインターフェイス専用に、さらに言えば、共通インターフェイスまたはインターフェイスのセットごとに、個別の共通アセンブリを作成しますか?(ああ?)

Commom ClosureCommonReuseの原則を考えて、インターフェイスを個別のアセンブリにグループ化します。自分自身でいることによって、彼らはまた、より安定します。それらが使用されるシナリオについて考えてください-それらを一緒に保つことは理にかなっています-もしそうなら、それらはおそらく1つのアセンブリでOKです。

于 2011-02-21T06:56:30.643 に答える
2

インターフェイスを別のアセンブリに配置するか、同じアセンブリ内の実装の近くに配置することをお勧めします。インターフェイス自体とともに、インターフェイスの少なくとも 1 つの実装が常に存在する必要があります。一般的なアプローチは、別のフォルダーの下の同じアセンブリにインターフェイスを配置することです。

于 2011-03-14T10:18:38.300 に答える
2

あなたが提案したように、単純にコントラクトまたはインターフェイス アセンブリを使用できます。

ただし、懸念事項の分離の原則で作業しようとしている場合、すべてのインターフェイスのすべての実装を同時に置き換えることを期待していますか、それともあちこちで 1 つの具体的な実装を置き換えることを期待していますか。

すべてを置き換えることが予想される場合は、個別のアセンブリが最適な場合があります。それ以外の場合は、既存の実装と一緒にモデル アセンブリの実装を置き換えるだけでよく、インターフェイスもモデル アセンブリで宣言されます。

于 2011-02-20T05:50:58.263 に答える
-1

SoC は、物理的な概念に変換しようとしている論理的な概念です。

リポジトリをモデルに配置することの唯一の悪影響はアセンブリです。将来、アセンブリを交換するのが難しくなる可能性があります。私はこの懸念を理解していませんか?宇宙人が侵略し、銀河時間をデータベースに入れる必要があるかもしれません. その抽象化を今コーディングする必要がありますか? おそらくそうではありません。

その気遣いも理解できません。モデル アセンブリに Concrete1 : IRepositoryとを含めることを妨げているのは何ですか?Concrete2 : IRepository

また、Model クラスの変更によってアプリケーションのコアを変更する必要がある場合は、おそらく何かが間違って結合されている可能性があります。それは少し後ろ向きです。

于 2011-02-20T06:44:37.200 に答える