数据访问层设计模式

Posted

技术标签:

【中文标题】数据访问层设计模式【英文标题】:Data Access Layer design patterns 【发布时间】:2010-11-06 13:02:09 【问题描述】:

我必须使用 .NET 设计一个数据访问层,它可能会使用多个具有相同关系设计的数据库管理系统(mysql 和 Sql Server)。

基本上,从一个数据库切换到另一个数据库必须很简单,所以我希望您向我推荐一些对您有用的网站或书籍,以及实现这种类型的通用设计模式或一般信息数据访问层。

谢谢。

【问题讨论】:

【参考方案1】:

我推荐 Martin Fowler 的企业应用架构模式。

模式列表也在他的website

DataMapper 模式也很重要。

【讨论】:

我正在阅读这本书,我可以全力推荐!太好了! +1【参考方案2】:

我喜欢使用基于接口的数据库访问。 Ado.net 的每个 db 提供程序都实现了基本接口,当您使用它们时,您的代码可能如下所示:

public static IDbConnection GetConnection(string connectionName)

  ConnectionStringSettings ConnectString = ConfigurationManager.ConnectionStrings[connectionName];
  DbProviderFactory Factory = DbProviderFactories.GetFactory(ConnectString.ProviderName);
  IDbConnection Connection = Factory.CreateConnection();
  Connection.ConnectionString = ConnectString.ConnectionString;
  return Connection;

那么,当你需要和db通信时:

public static DataTable Dummy()

  using (IDbConnection Connection = GetConnection("SiteSqlServer"))
  
    IDbCommand Command = Connection.CreateCommand();
    Command.CommandText = "DummyCommand";
    Command.CommandType = CommandType.StoredProcedure;

    Connection.Open();

    using (IDataReader reader = Command.ExecuteReader())
    
      DataTable Result = new DataTable();
      Result.Load(reader);
      return Result;
    
  

使用这种技术,您可以创建完全独立于数据库的 DAL。当然,对于一些复杂的场景,这还不够。但大多数情况下,这将完成工作,并且您不需要各种外部库。

【讨论】:

【参考方案3】:

最简单的解决方案是使用 ORM。查看LLBLGen. 使用适配器模型,您可以在使用相同业务对象的同时在数据提供者之间切换。它可以为 MySql 和 Sql Server 生成代码。

【讨论】:

@Bob:ORM 很好,但他的问题不需要;只能切换数据库。任何 ADO.NET 技术都可以为他做到这一点。 AFAIK ADO.NEt 不会理清 pl/SQL 和 TSQL 之间的差异,例如,它会。一个好的 ORM 将提供抽象并为您完成 SQL 部分。【参考方案4】:

总的来说,我赞同 John Nolan 的 Patterns of Enterprise Application Architecture 推荐。

更具体地说,我始终建议您将数据访问层隐藏在接口后面,并使用依赖注入在运行时将特定数据访问组件注入到您的域逻辑中。

您可以使用依赖注入容器或do it manually。

在技术方面,我推荐微软的Entity Framework,因为您的数据访问需求似乎受限于关系数据库。 Entity Framework 是 Microsoft 的官方 OR/M,它为许多不同的 RDBMS 提供了提供程序,并支持 LINQ。

【讨论】:

【参考方案5】:

这实际上取决于您的层大小和您开发的产品类型。如果它包含得相当好,那么 ADO.NET 可能是理想的。如果它是一个更大的 DAL 层,并且它是多目标 dbms 的绿地开发,最好使用 ORM 工具。它们是快速、高效和成熟的产品,只需更改单个参数即可快速启用重定向到另一个数据库。编写静态 ADO 是一种传递到传统的东西。

有几种 ORM 工具可以完成这项工作,它们的工作方式略有不同,并且依赖于 根据您的预算、团队规模等。它们可以通过编写 NHibernate 之类的映射类来工作,也可以通过反射(即属性标记)来工作。

免费,即开源,如果你的皮肤,NHibernate 是理想的。我目前正在使用它来构建 DAL 层,用于大型企业产品。它很棒,但需要一些时间来掌握。使用 NHibernate,您可以定义映射类,这些类在执行时会为您生成 db 模型。它支持存储过程。缺点是需要一些时间来学习,尤其是在正确映射复杂数据方面。它的优秀。它有大量的样本和其他浮动的项目使用它。查看 Koders.com。

如果您有一些预算,那么 LLBLGen 是理想的选择。它是强类型的,也支持存储过程。

如果已经有一些数据模型可用,那么 TierDeveloper 是理想的选择。它本质上是免费的,并且通过从您的数据库模型开发一组类来工作。唯一的缺点是 mysql 的映射器是第 3 方。它是一种企业级产品,已免费支持 ncache,它是一种可能的方法。

如果你不顾一切地坚持使用 MS,他们正在转向 ORM,并且有一个名为 ADO.NET Entity Framework 的产品。从功能上讲,它不像上面定义的工具那么完整。它的成熟度落后了大约 3 代。它在 vs 2008 sp1 中可用。 mysql 的连接器将是一个成本。

另外,您可以使用 LINQ。如果您还需要连接器,它还将针对 mysql。

理想情况下,您最好的选择是使用 ORM。如果你不能支持开源,并且有预算, 然后得到

希望对您有所帮助。

【讨论】:

【参考方案6】:

我发现ADO.NET 对此非常有用。它具有创建独立于您使用的数据库的数据访问层所需的所有功能。

【讨论】:

【参考方案7】:

NHibernate专为处理这种情况而设计,如果你愿意学习的话

【讨论】:

标准的DataSet类也能处理这种场景,不是吗? 是的,您是对的,但是 NHibernate 为您提供了更高级别的抽象(例如,您不再编写 SQL,而是使用 NHibernate 的内置 int 查询语言或 LINC(当它可用时))并且使您更容易将您的数据模型移植到另一个数据库引擎。

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

数据访问层设计

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

数据访问层的设计模式

设计数据访问层

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

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