设计数据访问层

Posted

技术标签:

【中文标题】设计数据访问层【英文标题】:Designing the Data Access Layer 【发布时间】:2010-12-03 18:22:06 【问题描述】:

我遇到了一个关于如何设计我的 DAL 的设计问题。 众所周知,在其最基本的定义中,DAL 表示层 负责与一些数据存储库通信(当然我不是在谈论存储库模式), 通常是一个数据库。现在这就是问题所在。 我们的一些业务对象必须从数据库中获取它们的数据,而另一些则需要从其他来源(即 Web 服务)获取它们的数据。 我们团队中的一些成员建议 BO 应该足够聪明地知道是否调用 DAL(它只知道与数据库通信) 或调用所需的 Web 服务。其他人则认为这可能不是一个最佳解决方案,建议一切都应该通过 DAL,其中它将包含比方说适配器或其他任何数据检索方法。

您将如何构建具有此类数据访问需求的系统? 从长远来看,任何建议的解决方案是否足够好(第二个可能需要更多时间来开发) 还是我们需要采取完全不同的方法?或许有适合这类问题的设计模式……

谢谢, Avi Shilon

【问题讨论】:

【参考方案1】:

我强烈推荐第二种方法。业务逻辑不应该对数据源一无所知。

当它不知道时,除了通常的好处(由于隔离和更简洁的设计而更易于维护),您还可以灵活地(取决于您的 DAL 的设计程度):

根据您的最低要求,从各种数据源检索数据

从一组优先的数据源中检索数据以实现故障转移。

例如您可以从 Reuters 实时报价服务获得最新报价,但当由于 WAN 问题导致报价中断时,您将求助于备用服务或数据库中缓存的旧价格。

显然,数据源是按照质量不提高和可靠性不降低的优先级排序的。

从一组优先的数据源中检索数据以实现缓存

例如从本地缓存中检索价格,如果缺失,则从本地数据库检索,如果缺失,则向供应商服务请求。

此外,为了更易于维护的一个具体示例,如果您的数据源从实时查询的供应商服务更改为由供应商推送信息填充的内部黄金副本数据库,您只需要更改 DAO,而不是需要数据的众多 BO 中的每一个。更容易更改,测试和部署更改也更安全。

【讨论】:

+1 我自己也会写同样的答案。但可能不太清楚;-) 你在 DVK 中有一些优秀的点,其中一些是我没有想到的。此外,您暗示使用 DAO 模式我将能够实现这种灵活性。这是您建议我应该针对这种情况实施的模式吗? (DAL 尚未实施。我们还有很长的路要走,非常感谢任何有用的提示;))。非常感谢 DVK @KLE - 这是我第一次被指责写得很清楚。曾经。我不是在开玩笑。谢谢! @Avi - 在不知道确切的域和要求的情况下,除了我的答案之外,我真的不会有太多的具体提示。与数据流的高级设计相比,特定的模式实际上并不重要,这在很大程度上取决于您的数据源、它们的性能和可靠性以及您的应用程序的需求。

以上是关于设计数据访问层的主要内容,如果未能解决你的问题,请参考以下文章

如何适当地设计数据访问层?

使用 C#、SQL Server 设计数据访问层

软考 系统架构设计师论文范文③ 论数据访问层设计技术及其应用

设计数据访问层

DDD中的数据访问层设计

PetShop数据访问层之数据库访问设计 - 《解剖PetShop》系列之二