2009-06-30 65 views
5

我目前代表我的应用程序中的单个项目中的业务层和数据层。我在两套课程之间有很好的分离关系。但是,我的数据层类作为参数并返回我的业务对象。因此,我将不得不代码大概类似于(请不要太挑剔这个代码,我的生产代码看起来并不喜欢这个):如何完全分离我的业务层和数据层?

//business class fragment 
public bool Save() 
{ 
    if(this.IsValid) 
    { 
     //DataProvider is one of many data access classes that implement an IDataProvider interface. Switched elsewhere in the class. This allows switching of Database providers, xml, etc. 
     DataProvider.Save(this); 
     return true; 
    } 
    return false; 
} 

public List<MyBusinessObject> GetObjectsByCriteria(string criteria) 
{ 
    return DataProvider.GetMyBusinessObjectsByCriteria(criteria); 
} 

我不希望我的业务类有处理DataSets比我更喜欢让我的数据层类处理业务类。

我已经读了很多数据访问对象或数据传输对象来解决这个问题,但这似乎是这些模式的反模式案例。

我该怎么办?如何优雅地实现我的应用程序的这两个层的完全分离?

回答

2

这是一个比如何将域模型与数据访问分开的更普遍的问题。当您尝试将应用程序逻辑与领域模型,应用程序逻辑的演示模型等分开时,会出现同样的问题。

常见的解决方案是称为依赖注入(DI)的技术。有些人也将其称为控制反转(IoC)。

关于这个问题的开创性文章是Martin Fowler的文章Inversion of Control Containers and the Dependency Injection pattern,但是从那以后我们已经走过了很长的路,所以一定要研究一些更近期的文章。

您可以手动执行DI,如described in this blog post,或者您可以让DI容器(即,一个框架)为你做好工作。

通用的DI容器是:

1

从业务对象中提取持久性逻辑并将其放入数据Adapter。它的工作方式就像.NET中现有适配器的工作方式(OleDbDataAdapter)。这样你也将分离你的业务对象和持久性逻辑。

你的客户代码会稍微冗长些,但我认为这是真正分离图层的最好方法。

+0

这是我们所做的,但我们也将它与DTO结合起来。 – 2009-07-01 01:04:32

0

这样做的流行模式是Repository模式。在这种情况下,存储库充当使用集合语义的外观,完全隐藏持久数据所在的位置,无论是文件系统还是数据库。您可以实现它来访问数据,然后将数据映射到您想要使用的任何类型。

您可能会将域驱动设计视为您使用的Active Record模式的替代方案。

0

你应该看看DAO模式(数据访问对象)。 http://en.wikipedia.org/wiki/Data_Access_Object

最好的是,使用现成的DAO构造(弹簧加载)。看看http://trac.synyx.org/hades

DAO不是反模式!使用它们与春天和泛型,你不必在意;)

有层次之间的每一次连接!完全分离它们意味着它们没有可用性进行通信(所以它们是无用的)。

使用基本的CRUD操作或动态查找器,无论它是否具有语义意义。

2

我不认为你可以有两个完全分开的,但你可以确保依赖不是双向的。

我想定义一个几件事情是很重要的:

  1. 模型对象(例如,人,地址,订购等)
  2. 持久层(例如,DAO中,仓库等)
  3. 服务层(其方法映射到用例,知道工作单元等的接口)
  4. web或查看图层(控制器/网页应用程序,桌面小部件)。

持久层,服务层和视图层了解模型对象;模型对象是无视他们所在的层

对于诸层中的依赖关系是单向的,并流回到前:

  • persistence->模型
  • 服务 - >模型,持久性
  • 视图 - >模式,服务从后到前

你的单元测试,因为依赖关系可以很容易地嘲笑。

不可能有没有依赖,但你应该设计它们,所以没有周期。

唯一的类没有依赖关系是一个被称为没有人,从不调用另一个类。这既不有用也不是一个有价值的设计目标。

+0

我在Nosredna的问题上没有看到“很好的分离问题”。我认为这个帖子migth澄清了一些概念和帮助。好帖子,duffymo! – 2009-08-04 21:37:05

0

n层设计:在业务逻辑层中,您可以创建数据访问类和数据操作类。总是编程到一个接口。