题
给定一个代码项目,该项目应该通过实现松散耦合层,具有IoC容器等来遵守SoC原则。 例如,一个简单的ASP.NET MVC解决方案,分为以下程序集:
- 申请表格 程序集+命名空间
- 模型 assembly+namespace(包含访问数据库数据的具体存储库)
以及在 模型 程序集必须实现公共接口 IMyBusinessRepository
, ,你会把那个接口放在哪个程序集中?
1)如果你把那个接口放在 模型 程序集,可能是不可能用另一个程序集替换该程序集(至少如果它具有不同的命名空间)而不修改 申请表格 组装。另外,一个替代方案 IMyBusinessRepository
驻留在不同程序集中的实现必须引用原始程序集(啊!)
2)如果你把它放在 申请表格 组装,这将是不可能使用的 模型 程序集在其他项目中,而不引用 申请表格 大会(啊!)
3)或者你会为该接口创建一个单独的公共程序集,并且为此,为每个公共接口或一组接口创建一个单独的公共程序集?(啊?)
总结一下, X 装配在应用中应易于更换 A (仅仅通过更改引用),并在应用程序中可重用 B, C, D.
其他提示
您可以简单地使用合同或接口程序集,如您所建议的。
但是,考虑到您正在尝试使用-在关注主体的分离中,您是否期望在同一时间替换所有接口的所有实现,或者可能只是这里和那里的单个具体实现。
如果您希望替换所有的程序集,那么最好使用一个单独的程序集,否则您可以简单地在模型程序集中替换现有实现,并且接口也在模型程序集中声明。
我建议将接口放在单独的程序集中或接近它们在同一程序集中的实现。应该始终至少有一个接口的实现以及接口本身。常见的方法是将接口放在同一个程序集中,在单独的文件夹下。
SoC是一个逻辑概念,您正在尝试将其转化为物理概念。
将存储库放入模型的唯一不利影响是汇编,也许将来很难交换程序集。我不明白这种担心?也许外星人会入侵,我们需要把银河时间放在我们的数据库中。我们现在应该编写抽象代码吗?可能不是。
我也不明白这种担心。是什么阻止了你 Concrete1 : IRepository
和 Concrete2 : IRepository
在模型组装?
如果您的应用程序的核心需要通过模型类的更改来修改,那么您可能会错误地耦合某些东西。这有点倒退。