winforms - 使用依赖注入(inject)的分层解决方案的 Visual Studio 项目中的接口(interface)放置位置

标签 winforms dependency-injection interface n-tier-architecture 3-tier

我正在使用 WinForms、Visual Studio 2015、Entity Framework 6 和依赖项注入(inject)开发分层解决方案,无需使用第三方容器。目前,我有一个结构,如果我将执行工作所需的接口(interface)放在共享项目中,则允许 UI、BLL 和 DAL 不需要相互引用。请参见下图中的选项 A:

enter image description here

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/

相关文章:

c# - c# winforms 应用程序无法正确显示 exe 的说明

C# Windows 窗体 - 调整窗体大小时移动元素

c# - 拖动时 TreeView 自动滚动

java - Spring Boot 执行器端点覆盖

java - 可序列化的标记接口(interface)可以包含默认方法吗?

c# - 不使用输入控件更新文本框

java - Spring单例初始化完成后如何运行方法?

java - EJB3 bean 部署依赖项

struct - Go 接口(interface)字段

c# - 给定一个对象,我如何以编程方式告诉它支持哪些接口(interface)?