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