数据层的职责是什么?

时间:2013-11-01 09:42:56

标签: .net design-patterns data-layer

我正在开展一个项目,我必须在我的应用程序中添加数据层。我一直认为数据层纯粹是CRUD函数的责任,即。不应该真正包含任何逻辑,而应该只是检索要操作的业务层的数据。

但是我对我的项目有点困惑,因为我不确定我是否为这种情况正确构建了我的应用程序。

基本上我正在尝试从数据库中检索属于特定定价阈值的产品列表。目前我在我的数据层中有一个功能,基本上返回价格>的所有产品。最小阈值和价格<最大阈值。但它让我想到也许这是不正确的。数据层是否应该只返回所有产品的列表,然后业务逻辑进行过滤?

我对数据层是否应该只提供允许业务层获取原始数据的方法或是否应该负责获取过滤数据感到困惑?

如果有人有文章或其他详细说明,那将非常有帮助。

由于

2 个答案:

答案 0 :(得分:1)

这里没有正确或错误的方法,通常归结为适合您实施的最佳方式。

拥有“数据层”或“模型”的目的是,如果需要,您可以相对轻松地将持久层换成完全不同的东西并使一切正常工作。

那就是说,我通常会包含过滤返回记录集的功能,作为我模型的一部分,如:

public IEnumerable<object> getAllRows()
public object getSingle(object o)
public IEnumerable<object> getFilteredRows(Expression<object> e)

过滤结果的表达式将在业务层(控制器)中生成,但实际执行时将由数据处理(模型)。

答案 1 :(得分:1)

数据层的目的是与数据存储库进行数据相关的交互。 如果您想变得非常纯净,可以将数据层分为两部分:D ata A bstraction L ayer和D ata I独立L艾尔。 DIL负责为您正在连接的数据存储库组装正确的查询(例如,您可以选择SQL Server或Oracle),而DAL位于DIL之上并调用适当的方法来获取数据需要(例如,它可能指定要调用的存储过程或要查询的表/视图,但DIL负责实际执行调用)。

在你的情况下,我会删除数据层的过滤器,即调用者应该传递阈值。在伪代码中,您的方法签名如下所示:

public YourDataObjects[] GetProducts(decimal lowerPrice, decimal upperPrice) { ... }

我已经使用了一个数组作为返回类型,因为几乎所有语言都有(你没有指定你正在使用哪种语言),这也是使用decimal类型作为阈值的原因