2011-09-09 47 views
1

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

我在建议一个更具体的问题,我问here,但我想要更多的一般性建议。

我该如何着手在VS2010中设置这样的项目?我需要一个第三个项目,以容纳DI东西(我使用Ninject)

编辑:例如

这里是我的两个层的一个例子。第一层具有IUnitOfWork接口,第二层具有实现所述接口的类。按照这种方式安装,除非第2层有对第1层的引用,否则该项目不会生成。我该如何避免这种情况?或者,我应该甚至不担心引用,因为这些图层是彼此相邻的,所以不要单独放置它?

1个

public interface IUnitOfWork 
{ 
    void Save(); 

} 

2层

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

回答

1

一般的建议是通过接口来分离层,并使用依赖注入和IOC容器的灵活性极大的水平,同时保持应用程序。 但有时它可能是小应用程序的矫枉过正,所以为了给你一个更具体的例子,你必须至少提供它所具有的应用程序和图层的描述。

关于DI的东西,我建议把它封装在一个单独的程序集中。回答到关于评论界面

只有一个办法摆脱这种耦合的是存储在一个单独的组件共用接口/类:

由Martin Fowler Inversion of Control Containers and the Dependency Injection pattern

EDIT见大文章。在你的情况下创建单独的程序集,并放在这里是IUnitOfWork接口。

编辑: Ninject项目中引用

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

+0

感谢您的回应。我已阅读福勒文章,这很棒。我想我的困惑源于假设如果一个图层实现另一个图层的接口,如果我没有从实现图层到接口所在图层的引用,如何构建解决方案? – stephen776

+1

在单独的组件中提取接口,该组件将被所有图层引用并使用DI。 –

+0

上面增加了一个例子 – stephen776

1

这是一个已知的“紧耦合VS松耦合耦合“的困境,并没有一般的建议。它很大程度上取决于组件的规模,它们如何互动,它们多久发生一次变化,哪些团队在其上进行工作,构建时间是多少。

我的一般建议是保持平衡。不要因为每个迷你班的脱钩而变得疯狂,另一方面,不要创造出一个小小的修改导致整个世界重建的庞然大物。

  • 凡变化预计,青睐松散耦合组件
  • 当稳定的预期,青睐紧耦合组件

它始终是一个权衡:

有与每项决定相关的费用:

必须在紧密耦合的组件上进行更改的成本众所周知。 -The变化是侵入性的 - 它可能需要大量的工作,以确定在依赖链的一切 - 它很容易错过依赖 - 它是很难保证质量

在另一方面,过度的成本工程是太糟糕 -code膨胀 - 复杂 -slower发展 -difficult新开发成为生产

要将例如: 看看交通灯实例与微软的统一应用程序块 磨磨蹭蹭

+0

重新设计如下'IUnitOfWork'包含要保存的数据。 'IUnitOfWorkLogic' - 在'IUnitOfWorkNotifier'上保存或执行一些其他工作的对象,它调用它。所有这些在同一个接口程序集中声明。 –

0

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