在在分层体系结构理论上可以具有相同的层上的多个模块。可这一模块的交叉引用对方?是有可能在技术上,如。使用.NET?

有帮助吗?

解决方案

这当然是可能这样做,只是要小心不要引入模块之间的任何循环依赖。通常,在给定的层模块应该只依赖于由相同的层或从它下面的层的其它模块。模块不应该知道它们之上的层。

如果你想使此更加严格,则可以限制也正下方的电流一个来自相同或其他层的依赖于其他模块。

保持暴露的接口到最小,例如只露出了一组核心的公共接口,值对象和异常的始终是一个好主意。可以使用的语言的访问控制功能(即,私有/包/公共)从蔓延到其它层限制模块内部的可见性。

其他提示

从技术上讲,你可以交叉引用您的.NET想要的任何方向(有没有为DAL引用UI组件技术的限制,即使它可能不是一个好主意)。我认为没有问题,在同一层内引用模块。

但是,我们需要看词“层”位,因为层有不同的形状和大小。通常,当我们用“层”,我们认为数据访问层或表示层,我们通常允许层向下看而不是upwars。

在每个层中,不同的模块通常还让自己被布置成层,从逻辑上。同样的规则适用于这里;模块可以往下看,但不起来。考虑到这一点它感觉相当安全的相同层(外层)中引用的模块。

只是不具有两个模块相互引用,直接或间接地。如果您发现A和B都需要彼此的功能(这表明A和B都在同一水平上),你可能需要重构代码,也许引进一个新的模块C,逻辑性低于A和B两个它们可以使用。

记还保持,以保持模块,分离成为可能;少它们知道彼此,就越好。

作为帕维尔说,要小心你的循环依赖。如果你绝对不能没有一个循环依赖(你所说的交叉引用),类必须是可不仅来自同一个“层”,也同样装配。

这就是说,应该没有理由交叉引用 - 不仅应(如帕维尔所述)模块仅依赖于它们下面的层,即单向依赖性应当在所有情况下存在

有一些合乎逻辑的例外情况,例如在类似领域模型 - 一个客户都会有一些订单,说。这可能是在这种情况下,(尤指奥姆斯等)有用的对客户的订单列表,并从每个订单给用户一个参考。在像服务等的功能单位来说,应该只有单向的依赖关系。

要解决这个问题的一种方法是使用控制反转通过温莎,autofac,spring.net等,您可以定义在组件和接口消耗的具体实现该接口的另一个对象。另一个库中可能包含的实际执行(这意味着组件必须引用第一组件)。在这种情况下,IoC容器抓起执行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top