业务对象DAL设计

5

在设计业务对象时,我尝试了几种不同的编写数据访问层的方法。有些方法比其他方法效果更好,但我一直觉得必须有一种“更好”的方法。

我真的很想看到人们在不同情况下处理DAL的不同方式以及他们对技术的看法是否有效。

6个回答

4
我已经在许多Web / WinForms应用程序中严重依赖Billy McCafferty的NHibernate最佳实践文章/示例代码。这是一篇精彩的文章,除了教授基本的NHibernate和TDD之外,还提供了一个很好的坚实的样例架构。他试图向您概述他的架构和设计决策。
他使用通用的DataAccessObjects创建了一个非常优雅的DAL,您可以为每个域对象扩展它,并使用接口和DAOFactory将其与BL松耦合。如果您以前没有使用过NHibernate,我建议首先查看BasicSample。
请注意,这篇文章严重依赖于NHibernate,但我认为这种一般方法很容易改变以适应其他ORMs。

2
很遗憾,我认为没有“更好的方法”,它太依赖具体情况,你使用什么DAL方法。
Martin Fowler的《企业应用架构模式》是关于“最前沿”技术的一次伟大讨论。
第10章“数据源架构模式”特别讨论了大多数商业应用程序中常用的模式。
总的来说,我发现使用最简单的方法满足基本的可维护性和适应性要求是最好的选择。
例如,在最近的一个项目中,我只需要一个简单的“行数据网关”。(这只是每个相关数据库表的代码生成类,包括执行CRUD操作的方法)。 没有无休止的ORM与存储过程之争,它只是起作用,并且很好地完成了所需的工作。

我同意不同情况下答案会有所不同,但我只是想寻找一些不同的技术以及它们的实际效果。 - Bob Dizzle

1

[更新]此内容已不再有效,该项目的设计已更改[/更新]

在我们的开源项目Bunian中,我们得出结论:业务对象(整个组件)是系统的核心,包括数据访问层在内的一切都应围绕它展开。

业务组件将向其他组件指示其需求,通过接口实现。例如,业务对象Person将具有名为IRepositoryForPerson的接口成员,需要时将通过依赖注入容器分配一个实例。

有关详细信息,请查看我的博客文章:

http://www.emadashi.com/index.php/2008/11/data-access-within-business-objects-bunian-design//

你可以在这里查看布念的代码(虽然它还是业余水平):

http://www.codeplex.com/Bunian

当然,采用这种方法会出现一些新的问题,比如数据访问会话的生命周期(例如,如果您使用NHibernate)。但这可能是另一个问题了。

希望这对你有用。


1

我假设你的意思是编写一个访问SQL的DAL,因为这是当今最常见的部分。编写针对SQL的DAL的最大问题之一是ORM部分。也就是说,面向对象编程和关系数据库模式之间存在根本的阻抗不匹配。已经有许多伟大的、成功的尝试编写ORM。但它们都有同样的问题,即它们的好处:将您从正在生成的底层SQL中抽象出来。为什么这是个问题呢?因为您的数据库性能是整个系统功能良好的关键组成部分。许多ORM(也许大多数)不仅在许多标准查询方面性能不佳,而且实际上还鼓励使用模式,这些模式会显著降低性能(例如,在循环内重复遍历关系时查询集合,使解决死锁变得困难)。当然,在详细了解ORM API后,通常可以找到避开这些性能陷阱的方法。

我对ORM的现状的看法是,我希望它尽可能地少做事情,同时仍然能够为我提供一个高效的库,来处理所有数据访问的细节。换句话说,因为我认为它们还不够“好”,并且可能永远无法与SQL作为后端相媲美,所以我想保留在裸机级别上的控制,并且在许多情况下会毫不犹豫地降到手写SQL的层面,而不管ORM如何,因为我知道我想要的数据查询方式。

这显然是一种比起宗教般地使用ORM更加脆弱的编码方法,因此,您必须在单元测试、SQL注入和适当的关注点分离方面格外谨慎。因此,总之,我同意Ash的观点,尽管这并不意味着他/她同意我的观点 :)


1

有几种常见的模式。'企业架构模式' 这本书是这些模式的好参考:

  • 表数据网关
  • 行数据网关
  • 活动记录
  • 数据映射器

如果您使用 ORM,例如 llblgen,则可以选择自助服务或适配器。


1
如果你选择使用NHibernate(顺便说一句,@Watson上面提供的文章链接很不错),那么我强烈建议你查看codebetter的suvius-flamingo示例项目。他有一个非常好的、简洁的示例项目,展示了MVC和NHibernate的实际应用。
这里是suvius-flamingo链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接