在我的C#解决方案中将接口存储在解耦架构中的位置?

时间:2014-07-15 04:25:29

标签: dll architecture interface decouple

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

我有一个组件库,它具有数据模型和基本功能,应该可用于实现此组件的任何应用程序。

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

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

选项包括:

1) - 在核心库中,然后当我编写实现时,我将不得不在这个核心组件中包含实现库,我希望保持从实现中删除。

2) - 在一个单独的图书馆项目(大会)中。所有接口都包含在核心组件中,并包含在实现库中。

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

唯一合理解耦的情况是,如果我将所有接口放在Core组件包含的单独汇编库中,以及我可能需要的任何实现。

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

所以当我做的时候

构造函数:

CoreComponent(IReader Reader, IDataMapper Mapper)

new CoreComponent(WindowsReader, SQLServerMapper)

并且不必将 WindowsReader SQLServerMapper 包含在核心组件中

干杯。

1 个答案:

答案 0 :(得分:3)

我会选择选项1 - 核心库,因为它与DDD中的方式一致。在DDD中,我们过去常常在域层中放置IRepository接口而不是DAL或任何其他类似的层。

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

  

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

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

选项2没问题,但你需要在其他项目中引用两个DLL,但是选项1只需要一个引用。选项3不合适。

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