2

依存性注入では、 AssemblyAにコンシューマーがあり、AssemblyB依存性の実装があるとします。依存関係の抽象化がコンストラクター引数としてコンシューマーに渡されるように、コンストラクターインジェクションを使用しています。抽象化はどのアセンブリにありますか?AssemblyAまたはAssemblyBまたはその他のアセンブリ(AssemblyC)AssemblyAおよびAssemblyBがAssemblyCからの抽象化を参照できるようにしますか?

4

3 に答える 3

2

私が理解していることから、あなたは持っています。

class AssemblyA.ClassA
{
    public ClassA(ClassB arg) { ... }
}

abstract class AssemblyB.ClassB
{ }

class AssemblyC.ClassC : AssemblyB.ClassB // some concrete implementation of ClassB
{  }

それで;

  • ClassBは、AssemblyAまたはAssemblyBのいずれかに属することができます。この場合、AssemblyAはAssemblyBを参照します。
  • ClassCは、AssemblyA、AssemblyB、またはAssemblyCのいずれかに属することができます。この場合、AssemblyAはAssemblyBとAssemblyCの両方を参照し、AssemblyCはAssemblyBを参照します。

これはあなたの質問の些細なことです。

于 2012-06-04T10:39:29.623 に答える
1

あなたが求めているのは依存性逆転と呼ばれ、SOLIDの原則の1つです。依存性逆転は、実装ではなく抽象化に依存する必要があることを示しています。また、下位層が上位層を認識してはならないことも述べています。

それを念頭に置いて、すべてが非常に明確です=)

IUserService // abstraction, where should this be placed?
DbUserService //implementation, placed in YourApp.Core
UserController(IUserService) // usage, placed in YourApp.UI

上手。下位層(コア)は上位層(UI)を認識してはならないため、UIプロジェクトにインターフェイスを配置することはできません。

したがって、2つの選択肢があります。3番目のアセンブリまたはコアアセンブリです。

「分離されたインターフェース」と呼ばれる別の原則もあります。これは、インターフェースを別のパッケージ/アセンブリに配置する必要があることを示しています。

私は通常、インターフェイスを実装と同じパッケージに配置して、シンプルにしています。

于 2012-06-04T13:53:55.523 に答える