如何避免共享关系数据的模块之间的循环引用

时间:2015-09-23 21:02:21

标签: orchardcms orchard-modules

在非Orchard应用程序上,模式是隔离项目中的数据模型(和数据访问代码),该项目由域/业务逻辑库,Web应用程序项目,Web服务项目等引用。

Orchard 的想法似乎是将数据模型限制在一个模块中,而无意与其他模块的数据模型有任何关系。

“限制”可能有点苛刻或不准确 - 也许“限制”是这里措辞的更好选择。给定两个模块A和B,并且在处理模块A时,我们可以添加对模块B的引用,并使用存储库来实现它的实体。但是当处理模块B时,需要从模块A访问数据时,我们不能 - 至少在框架内不优雅。这里存在循环引用问题。

在这种情况下,我倾向于采取几种方法:

  1. 将这两个模块整合为一个模块(并且必须处理可能繁琐且有风险的数据迁移)。
  2. 直接访问数据而不使用框架或存储库
  3. 将所有数据模型放在所有其他自定义模块引用的单个模块中(同样,更多数据迁移风险)
  4. 在这里举手......
  5. 这是否正确解释了Orchard软件设计人员对模块和数据关系的意图?

1 个答案:

答案 0 :(得分:1)

从架构的角度来看,如果你需要两个模块之间的循环依赖关系,那么这通常意味着它应该是一个单独的模块。

我在类似场景中经常做的一件事是共享抽象定义和接口,而不是共享实现。您可以创建一个模块(或只是一个常规程序集),它只包含定义数据模型的接口。然后,您可以在实现模型的模块和依赖于模型的模块之间共享此库。唯一的限制是您必须通过接口访问模型,而不是具体的实现。

例如,查看在Orchard核心中如何实现ITitleAspect。您可以为模型实现类似的接口,并在单独的程序集中共享它们。这非常适合内容部分和内容项。