业务对象和数据层

时间:2010-09-14 16:33:23

标签: c# visual-studio-2008 data-access-layer n-tier-architecture

这个网站为我提供了许多有用的答案,但经过一个小时的搜索后,我找不到任何能够满足我需求的东西。所以这里......

我正在为之工作的公司正在设计新的业务对象层和数据访问层 - 这些将驻留在单独的程序集中。

问题是我很难理解这两层之间的相互作用 - 具体来说,如果DAL知道BOL,我读过很多文章说过依赖顺序应该像这样:

GUI /演示 - > BOL ---> DAL

但据我所知,DAL需要对BOL的引用才能将对象'返回'到BOL层。

我要在BOL和DAL之间进行中间组装,它基本上是一个薄层,里面装有接口来解耦这两个DLL,所以如果需要,框架可以使用不同的DAL。

这使我想到引入另一个薄层,其中包含BO实现的一堆接口,然后当BOL调用DAL接口时,它将一个实现其中一个BO接口的对象传递给它,然后DAL继续填充对象。这将删除BOL和DAL之间的所有依赖关系 - 但是,我发现很难证明它是诚实的。

理想情况下,我们想使用ORM,因为它只是删除了编写CRUD内容的需要,但是我们的客户习惯于在数据库中摆弄列长度,这是我们迄今为止使用的大多数错误的原因。强类型的DataTables。我听说Linq2SQL也在编译时存储列长度,不确定NHibernate是否存在(但是,我不确定我们的数据库模式是否为NHibernate设计得足够干净,处理遗留系统的陷阱)。

所以,对BOL和DAL之间关系的任何见解都会非常受欢迎 - 如果上述内容写得不好,请致歉,如果有人需要澄清,我会很乐意提供更多详细信息。

马龙

6 个答案:

答案 0 :(得分:3)

我这样做的方式是BO期望一个DataReader或一个DataContext或来自DAL的任何后退,而不是实际形成的对象。然后,BO层的工作是从回来的对象中获取并填充自己。 DAL没有返回完成的BO。要记住的主要事情是,在BO层中更改某些内容不应该导致DAL层出现问题,但是在DAL层中更改某些内容可能会导致BO层出现问题。

我通常做的一个简短例子

在BO层中

FillData(){
   DataReader dr = DataLayer.GetData("SomePropertyForAStoreProcedure");
   If dr.Read(){
    Property1 = dr.GetValue("Property1");
    //So on and so forth
   }
}

在DAL中

DataReader GetData(String SPProperty){

}

答案 1 :(得分:1)

看看SubSonic http://subsonicproject.com/,它可以为您提供大部分数据访问繁琐的工作,并且比大多数ORM更容易

答案 2 :(得分:1)

DAL需要对BOL的引用,以便它可以填充对象。您不希望有的是从BOL返回到DAL的任何引用或耦合 - 这样做会导致您的BOL耦合到特定的数据库实现。当你考虑它时,这是有道理的。您的DAL知道业务对象的详细信息,直到属性级别以及如何从数据库中检索数据 - 当然DAL本质上与BOL紧密耦合。所以参考方式很好。如果你考虑一下另一方面是什么?数据库。从您的对象数据到数据库的“紧密耦合”?是的,它非常紧张。这个概念甚至没有多大意义。

这是你需要解耦的另一个方向。所以,只要不存在从DAL到BOL的直接耦合,您就可以随意更改数据平台。

在这种情况下,为BO创建接口并将它们传递给DAL没什么意义。但是,您有时可能需要采用其他方式。通常,业务对象不应该知道有关如何创建或持久化它们的任何信息。

在实践中,即使对于大多数ORM,例如,创建完全没有任何类型的持久性工件的业务层可能变得非常困难,有时实际上是不可能的。所以偶尔你会遇到一些难以解决的事情,你可能会发现严格避免在BO中拥有任何数据知识会导致你过度复杂而不是增加价值。

如果您觉得没有更好的方法,并且您需要在BOL中保留一些内容,请创建一个简单的界面,以便将DAL功能传递给BOL。这样,您至少可以将BOL与特定数据库实现分离。

此外,虽然这是一项额外的工作,除非这是一个非常简单的一次性应用程序,我强烈建议您在UI和BOL之间添加另一个层。 MVP(Model-View-Presenter)模式是一种通用设计模式,用于减少核心应用程序和UI之间的耦合。演示者有很多变种,不要过于关注具体细节,如果你从未使用它,那就从简单的MVP开始吧。

模式并不那么难,只是UI本身非常混乱,在你觉得你在任何时候编写的代码系统地和有条不紊地工作之前,它可能至少会带你几个主要的迭代/应用程序解耦UI。只要继续努力,开始掌握各种技术,并且不要因为你真的没有实现清晰的分离这一事实。你所学到的任何东西都能做到这一点,甚至可以为在UI上创建一个明确定义的边界做出一点贡献,这是朝着正确方向迈出的一大步。

答案 3 :(得分:1)

“正确”方法将根据业务需求而变化。说实话,有很多项目让我觉得旧式的ado记录集比现在的许多ORM产生更少的开发时间并且更容易维护。花些时间确定您的需求,并记住开发时间和可维护性是设计目标,也应该适当权衡。

答案 4 :(得分:0)

它还取决于您使用的/ /库/ ORM(对象关系映射器)。当使用(好)ORM时,DAL应该是一个非常遥远的问题,因为它几乎被ORM完全隐藏;但是,最佳实践要求即使在那时,对于中型到大型应用程序,也应该在BOL和ORM之间引入另一层,通常是DTO(数据传输对象)。 DTO也可以在没有ORM的情况下使用,因为它们只是在单独的库中定义的哑对象,并且DAL可以负责持久化它们(将它们从/向数据库结构转换),而BOL可以查询DAL并接收这些对象。

可以通过各种方式实现层的解耦,最常见的是通过接口和/或MEF或另一个DI / IOC框架。如果有效使用,任何此类技术都可实现更多的解耦。

此外,正如Sisyphus所说,取决于所使用的技术,其中一个分层架构模式将有助于很好地分离关注点:MVC,MVP,MVVM等。我个人推荐MVVM与WPF(桌面)或Silverlight(web)但我高度偏见 - 即我喜欢他们两个都死了:)

答案 5 :(得分:0)

这些是我的发现,
1.使用接口
2.在DAL和DAL之间使用DTO [数据传输对象]。 BLL
3.将BLL拆分为两个,
a. BLL
b. Service Layer
4.使用控制反转(IoC)容器使耦合保持尽可能低。