我正在使用 WinForms、Visual Studio 2015、Entity Framework 6 和依赖项注入(inject)开发分层解决方案,无需使用第三方容器。目前,我有一个结构,如果我将执行工作所需的接口(interface)放在共享项目中,则允许 UI、BLL 和 DAL 不需要相互引用。请参见下图中的选项 A:
BLL 中的服务很薄弱,因为它们基本上调用 DAL 中的完整实现(即 BLL.GetDepts 调用 DAL.GetDepts)。最初,我在 BLL 中定义了接口(interface),如选项 B 所示。选项 B 还需要DAL 需要引用 BLL 来理解接口(interface)。此外,UI 也必须引用 BLL。但是,BLL 不需要引用 UI 或 DAL,因此它不依赖于任何一层。虽然选项 B 并没有让所有层依赖都自由,我开始怀疑这是否实际上不是一个坏主意。使用选项 B,只要替换层满足接口(interface)要求,我仍然可以替换 UI 或 DAL,而不影响 BLL 。无论我使用选项 A 还是 B,对 UI 或 DAL 的任何更改仍然需要使用 BLL 进行测试。因此,我开始认为努力使所有层彼此独立并不是真正需要的,也不实际。
我开始质疑我转向选项 A 的原因是,当我增加带有接口(interface)的类数量以扩展 BLL 功能时,我也增加了共享区域中接口(interface)条目的数量。直观地查看我的 Visual Studio 项目,我认为任何需要 BLL 中的内容的层都应该在 BLL 层中找到描述 BLL 所需内容的接口(interface)。这就是B选项所做的。现在,对于选项 A,我说任何希望实现 BLL 某些内容的层都必须查看共享项目 BLL 接口(interface)部分。目前一切正常,但我不确定走这条路是否会导致一些问题。
所以问题是,“如上所述,追求选项 A 是否存在问题?”。
最佳答案
接口(interface)应该放在哪里取决于您最初引入接口(interface)的动机。
如果动机是获得松散耦合代码的好处,那么您最好遵守 SOLID principles 。具体来说,根据Dependency Inversion Principle ,“客户端[...]拥有抽象接口(interface)”(APPP,第 11 章)。
这意味着接口(interface)应该在与使用该接口(interface)的代码相同的库(程序集/Visual Studio 项目)中定义。
因此,您可以根据用途在各种不同的库中定义接口(interface)。您不需要将所有接口(interface)放在一个库中。
关于winforms - 使用依赖注入(inject)的分层解决方案的 Visual Studio 项目中的接口(interface)放置位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34229021/