分层架构中同一层上的模块

时间:2009-05-25 11:00:39

标签: architecture layered

理论上,在分层体系结构中,您可以在同一层上拥有多个模块。这个模块可以相互交叉引用吗?在技​​术上是可能的,例如。使用.NET?

3 个答案:

答案 0 :(得分:1)

当然可以这样做,只要注意不要在模块之间引入任何循环依赖关系。通常,给定层的模块应仅依赖于来自同一层或其下层的其他模块。模块不应该知道它们上面的层。

如果你想让这个更加严格,那么你也可以将相关性限制在当前层之下的相同或其他层中。

将暴露的界面保持在最低限度,例如仅公开一组核心公共接口,值对象和异常总是一个好主意。您可以使用该语言的访问控制功能(即私有/包/公共)来限制模块内部的可见性,使其不会溢出到其他层。

答案 1 :(得分:0)

从技术上讲,您可以在.NET中以任何方向进行交叉引用(DAL没有技术限制来引用UI组件,即使它可能不是一个好主意)。我发现在同一层中引用模块没有问题。

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

在每个层中,不同的模块通常也可以在逻辑上将它们自己排列成层。同样的规则适用于此;模块可以向下看,但不能向上看。考虑到这一点,在同一(外部)层中引用模块感觉相当安全。

只是没有两个模块直接或间接地相互引用。如果你发现A和B都需要彼此的功能(表明A和B在同一级别上),你可能需要重构代码,或许引入一个新的模块C,逻辑上放在A和B下面,两者都是他们可以使用。

还要记住尽可能保持模块分离;他们对彼此的了解越少越好。

答案 2 :(得分:0)

正如Pavel所说,小心你的循环依赖。如果绝对不能没有循环依赖(你称之为交叉引用),那么这些类不仅必须来自同一个“层”,而且必须是同一个程序集。

话虽如此,应该没有理由进行交叉引用 - 不仅应该(如pavel所说)模块只依赖于它们下面的层,在所有情况下都应该存在单向依赖。

此规则存在一些逻辑上的例外情况,例如在域模型中 - 例如,客户将拥有多个订单。在这种情况下(特别是使用ORM等),可能有用的是在客户上有一个订单列表,以及从每个订单中对客户的引用。就服务等功能单元而言,应该只有一种依赖关系。

解决此问题的一种方法是通过Windsor,autofac,spring.net等使用Inversion of Control。您可以在程序集中定义接口,并使用另一个使用该接口的具体实现的对象。另一个库可能包含实际的实现(意味着程序集必须引用第一个程序集)。在这种情况下,IoC容器会抓住实现。