.net 数据层最佳实践 我正和一位同事讨论如何在一个新的应用程序中实现数据层的最佳方式。

.net 数据层最佳实践 我正和一位同事讨论如何在一个新的应用程序中实现数据层的最佳方式。,.net,n-tier-architecture,.net,N Tier Architecture,一种观点是,数据层应该知道业务对象(我们自己的类表示一个实体),并且能够以本机方式处理该对象 相反的观点是,数据层应该是对象无关的,并且只处理简单的数据类型(字符串、布尔值、日期等) 我可以看出这两种方法都是有效的,但我个人的观点是我更喜欢前者。这样,如果数据存储介质发生变化,业务层就不必(一定)改变以适应新的数据层。因此,将SQL数据存储更改为序列化xml文件系统存储是一件小事 我同事的观点是,数据层不必知道对象定义,只要适当地传递数据就足够了 现在,我知道这是一个有可能引发宗教战争的问题,但

一种观点是,数据层应该知道业务对象(我们自己的类表示一个实体),并且能够以本机方式处理该对象

相反的观点是,数据层应该是对象无关的,并且只处理简单的数据类型(字符串、布尔值、日期等)

我可以看出这两种方法都是有效的,但我个人的观点是我更喜欢前者。这样,如果数据存储介质发生变化,业务层就不必(一定)改变以适应新的数据层。因此,将SQL数据存储更改为序列化xml文件系统存储是一件小事

我同事的观点是,数据层不必知道对象定义,只要适当地传递数据就足够了

现在,我知道这是一个有可能引发宗教战争的问题,但我很感谢社区对你如何处理这些事情的反馈


TIA

我有一本很好的书,它涵盖了这个主题,是克利夫顿·诺克写的。关于如何将业务层与持久性层分离,它有很多很好的解释和好的想法。你真的应该试一试。这是我最喜欢的书之一。

我发现一个很方便的技巧是让我的数据层成为“收集不可知论者”。也就是说,每当我想从数据层返回对象列表时,我都会让调用者传入该列表。因此,与此相反:

public IList<Foo> GetFoosById(int id) { ... }
public IList GetFoosById(int-id){…}
我这样做:

public void GetFoosById(IList<Foo> foos, int id) { ... }
public void getfoosbyd(IList foos,int id){…}
这让我可以传递一个简单的旧列表(如果这是我所需要的),或者传递一个更智能的IList实现(如ObservableCollection),如果我计划从UI绑定到它。这种技术还允许我从方法中返回内容,如ValidationResult,如果发生错误,它将包含错误消息


这仍然意味着我的数据层知道我的对象定义,但是它给了我一个额外的灵活性。

< P>检查LINQ到SQL,如果我现在正在创建一个新的应用程序,我会考虑依赖一个完全基于LINQ的数据层。
除此之外,我认为尽可能地去耦合数据和逻辑是一种很好的做法,但这并不总是可行的。逻辑和数据访问之间的纯粹分离使得连接和优化变得困难,这正是Linq如此强大的原因。

两者都可以。让数据层不知道您的业务对象,并使其能够处理多种类型的数据源。如果为与数据交互提供公共接口(或抽象类),则可以为每种类型的数据源提供不同的实现。工厂模式在这里运行良好。

杰弗里·巴勒莫(Jeffrey Palermo)就此写了一篇很好的帖子。他称之为。

在我们使用NHibernate的应用程序中,答案是“介于两者之间”,因为XML映射定义(它们指定哪个表属于哪个对象,哪些列属于哪个字段等)明确地位于业务对象层


它们被传递给通用数据会话管理器,该管理器不知道任何业务对象;唯一的要求是,为CRUD传递给it的业务对象必须有一个映射文件。

这实际上取决于您对世界的看法——我曾经是非耦合阵营的成员。DAL只是在那里向BAL提供数据

随着LINQtoSQL和EntityFramework等新兴技术的流行,DAL和BAL之间的界限变得模糊了。特别是在L2S中,DAL与业务对象紧密耦合,因为对象模型与数据库字段有1-1映射


就像软件开发中的任何事情一样,没有对错的答案。你需要了解你的需求和未来的需求,并从那里开始工作。我将不再在达喀尔拉力赛上使用法拉利,就像在赛道上使用路虎揽胜一样。

以前的帖子,但我在搜索类似的信息时发现了这一点,这很好地解释了这一点

我完全同意。数据访问层等的设计变得相当模糊。然而,我总是选择将您的业务逻辑与表示层分离。MVC模式FTW;-)