接口或抽象所在的程序集在哪?

时间:2012-06-04 10:33:26

标签: .net dependency-injection

在依赖注入中,假设我在 AssemblyA 中有消费者,在 AssemblyB 中有依赖性实现。我正在使用构造函数注入,以便将依赖项的抽象作为构造函数参数传递给Consumer。抽象驻留在哪个汇编中? AssemblyA或AssemblyB或其他一些程序集( AssemblyC )以便AssemblyA和AssemblyB可以引用AssemblyC的抽象?

2 个答案:

答案 0 :(得分: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

这是对你的问题的轻视。

答案 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”的原则,它规定接口应该放在另一个包/组件中。

我通常将接口放在与实现相同的包中,以保持简单。