在我的 C# 解决方案中,解耦架构中的接口存储在哪里?

Posted

技术标签:

【中文标题】在我的 C# 解决方案中,解耦架构中的接口存储在哪里?【英文标题】:Where to store Interfaces in a Decoupled Architecture in my C# Solution? 【发布时间】:2014-09-05 03:43:07 【问题描述】:

我知道这个问题之前似乎已经回答过了,但我觉得答案因情况而异,所以在阅读了几篇帖子后,我不确定哪种情况最适合我的架构。

我有一个组件库,其中包含一个数据模型和基本功能,任何实现此组件的应用程序都应该可以使用这些功能。

我有这个组件的边界,它有一个接口 IReader 从磁盘加载和处理文件,IDataMapper 提供数据库访问和 CRUD 操作。 用于特定功能的一些其他接口,例如用于比较对象的 IObjectComparison、用于 XML 序列化的 IXMLSerialization。

我不确定在哪里存储这些接口的定义。

选项有:

1)- 在核心库中,然后当我编写实现时,我必须在这个核心组件中包含实现库,并且我希望保持与实现的分离。

2)- 在单独的库项目(程序集)中。那里的所有接口都包含在核心组件中并包含在实现库中。

3) - 在实现库中,核心组件必须包含实现库。

似乎合理解耦的唯一情况是,如果我将所有接口放在一个单独的程序集库中,其中包含核心组件以及我可能需要的任何实现。

你们认为最佳选择的优点/缺点是什么? 我想要实现的只是一个解耦的架构。

所以当我这样做时

构造函数:

CoreComponent(IReader Reader, IDataMapper Mapper)

new CoreComponent(WindowsReader, SQLServerMapper)

并且不必在核心组件中包含 WindowsReaderSQLServerMapper

干杯。

【问题讨论】:

物理上?可能是在保险库里打印出来的? ;p 【参考方案1】:

我会选择选项 1 - 核心库,因为它符合我们在 DDD 中的做法。在 DDD 中,我们曾经将 IRepository 接口放在域层而不是 DAL 或任何其他此类层中。

DIP 表示更高级别的组件将拥有该接口,正如Wikipedia 所说...

定义高级组件所需的行为/服务的接口归高级组件的包所有,并存在于高级组件的包中。

这是最常见的做法,但不是严格的规定。

选项 2 很好,但您需要在其他项目中引用两个 DLL,但选项 1 只需要一个引用。选项 3 不合适。

希望它会有所帮助。谢谢。

【讨论】:

以上是关于在我的 C# 解决方案中,解耦架构中的接口存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

C# 实例解释面向对象编程中的接口隔离原则

函数式编程和解耦

在哪里为分层架构中的存储库定义接口?

解决解耦组件中的冲突功能

在 C++ 中使用 C# 接口或在 C# 中使用 C++ 接口

我怎样才能解开这个项目