数据访问层设计模式
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(当它可用时))并且使您更容易将您的数据模型移植到另一个数据库引擎。以上是关于数据访问层设计模式的主要内容,如果未能解决你的问题,请参考以下文章