在多层架构中,相邻层是否可以相互引用?

时间:2011-09-09 11:33:58

标签: c# .net architecture

如果我有一个由多个图层组成的应用程序,在解决方案中定义为多个项目,是否可以让图层直接在其上方/下方引用该图层?或者,是否应该使用依赖注入来消除这种需求?

我正在建立一个更具体的问题,我问here,但我想提供更一般的建议。

我如何在VS2010中设置这样的项目?我需要第三个项目来容纳DI的东西吗?(我正在使用Ninject)

编辑:示例

以下是我的两个图层的示例。第一层有一个IUnitOfWork接口,第二层有一个实现所述接口的类。以这种方式设置,除非第2层具有对第1层的引用,否则不会构建项目。如何避免这种情况?或者,我是否应该甚至不担心参考文献并将其单独留下,因为这些图层彼此相邻?

第1层

public interface IUnitOfWork
{
    void Save();

}

第2层

 public DataContext : IUnitOfWork
 {
     public void Save()
     {
          SaveChanged(); //...
     }
 }

3 个答案:

答案 0 :(得分:1)

一般建议是通过接口对层进行分离,并使用依赖注入和IoC容器,以便在维护应用程序的同时实现极大的灵活性。 但有时它可能对小型应用程序来说太过分了,所以为了给你一个更具体的例子,你必须至少提供它所具有的应用程序和层的描述。

关于DI的东西,我建议将它封装在一个单独的程序集中。

请参阅Martin Fowler撰写的精彩文章Inversion of Control Containers and the Dependency Injection pattern

编辑:回答有关界面的评论

只有一种摆脱这种耦合的方法是将公共接口/类存储在单独的程序集中。在您的情况下,创建单独的程序集并在此处放置IUnitOfWork接口。

编辑: Ninject项目参考

有147个Ninject项目,我建议您从您的角度下载和调查最有趣的项目:Ninject projects

答案 1 :(得分:1)

这是一个众所周知的“紧密耦合与松散耦合”的困境,并没有一般性的建议。这在很大程度上取决于您的组件有多大,它们如何交互,它们变化的频率,哪些团队对它们起作用,您的构建时间是多少。

我的一般建议是保持平衡。不要因为解开每个迷你类而疯狂,另一方面也不要创造一个小块,一个小的修改会导致整个世界的重建。

  • 如果需要更改,请选择松散耦合的组件
  • 在需要稳定性的地方,支持紧密耦合的组件

这总是一种权衡:

每项决定都有相关费用:

必须在紧密耦合的组件之间进行更改的成本是众所周知的。 - 改变是侵略性的 - 确定依赖链中的所有内容可能需要做大量的工作 - 很容易错过依赖 - 保证质量很难

另一方面,过度工程的成本也很差 - 代码臃肿 -复杂 - 较低的发展 - 新开发人员难以提高工作效率

举个例子: 查看随Microsoft Microsoft应用程序块一起提供的Stoplight示例 enter image description here

答案 2 :(得分:0)

人们已经回答了你的问题。我建议“下面”层不应该引用“上面”层,因为下面的层目的是提供上层消耗的某些功能,因此它不应该知道任何关于上层的内容。就像TCP / IP堆栈的漂亮层模型