在依赖注入中,假设我在 AssemblyA 中有消费者,在 AssemblyB 中有依赖性实现。我正在使用构造函数注入,以便将依赖项的抽象作为构造函数参数传递给Consumer。抽象驻留在哪个汇编中? AssemblyA或AssemblyB或其他一些程序集( AssemblyC )以便AssemblyA和AssemblyB可以引用AssemblyC的抽象?
答案 0 :(得分:2)
据我所知,你有;
class AssemblyA.ClassA
{
public ClassA(ClassB arg) { ... }
}
abstract class AssemblyB.ClassB
{ }
class AssemblyC.ClassC : AssemblyB.ClassB // some concrete implementation of ClassB
{ }
然后;
这是对你的问题的轻视。
答案 1 :(得分:2)
您所询问的内容称为依赖性倒置,是SOLID原则之一。依赖倒置说你应该依赖于抽象而不是实现。它还指出,较低层不应该知道更高层。
考虑到这一点,一切都很清楚=)
IUserService // abstraction, where should this be placed?
DbUserService //implementation, placed in YourApp.Core
UserController(IUserService) // usage, placed in YourApp.UI
好。由于较低层(Core)不应该知道更高层(UI),因此我们无法将界面放在UI项目中。
所以我们有两个选择:第三个组件或核心组件。
还有一个名为“Separated Interface”的原则,它规定接口应该放在另一个包/组件中。
我通常将接口放在与实现相同的包中,以保持简单。