在设计业务对象时,我尝试了几种不同的编写数据访问层的方法。有些方法比其他方法效果更好,但我一直觉得必须有一种“更好”的方法。
我真的很想看到人们在不同情况下处理DAL的不同方式以及他们对技术的看法是否有效。
在设计业务对象时,我尝试了几种不同的编写数据访问层的方法。有些方法比其他方法效果更好,但我一直觉得必须有一种“更好”的方法。
我真的很想看到人们在不同情况下处理DAL的不同方式以及他们对技术的看法是否有效。
[更新]此内容已不再有效,该项目的设计已更改[/更新]
在我们的开源项目Bunian中,我们得出结论:业务对象(整个组件)是系统的核心,包括数据访问层在内的一切都应围绕它展开。
业务组件将向其他组件指示其需求,通过接口实现。例如,业务对象Person将具有名为IRepositoryForPerson的接口成员,需要时将通过依赖注入容器分配一个实例。
有关详细信息,请查看我的博客文章:
http://www.emadashi.com/index.php/2008/11/data-access-within-business-objects-bunian-design//
你可以在这里查看布念的代码(虽然它还是业余水平):
http://www.codeplex.com/Bunian
当然,采用这种方法会出现一些新的问题,比如数据访问会话的生命周期(例如,如果您使用NHibernate)。但这可能是另一个问题了。
希望这对你有用。
我假设你的意思是编写一个访问SQL的DAL,因为这是当今最常见的部分。编写针对SQL的DAL的最大问题之一是ORM部分。也就是说,面向对象编程和关系数据库模式之间存在根本的阻抗不匹配。已经有许多伟大的、成功的尝试编写ORM。但它们都有同样的问题,即它们的好处:将您从正在生成的底层SQL中抽象出来。为什么这是个问题呢?因为您的数据库性能是整个系统功能良好的关键组成部分。许多ORM(也许大多数)不仅在许多标准查询方面性能不佳,而且实际上还鼓励使用模式,这些模式会显著降低性能(例如,在循环内重复遍历关系时查询集合,使解决死锁变得困难)。当然,在详细了解ORM API后,通常可以找到避开这些性能陷阱的方法。
我对ORM的现状的看法是,我希望它尽可能地少做事情,同时仍然能够为我提供一个高效的库,来处理所有数据访问的细节。换句话说,因为我认为它们还不够“好”,并且可能永远无法与SQL作为后端相媲美,所以我想保留在裸机级别上的控制,并且在许多情况下会毫不犹豫地降到手写SQL的层面,而不管ORM如何,因为我知道我想要的数据查询方式。
这显然是一种比起宗教般地使用ORM更加脆弱的编码方法,因此,您必须在单元测试、SQL注入和适当的关注点分离方面格外谨慎。因此,总之,我同意Ash的观点,尽管这并不意味着他/她同意我的观点 :)