数据访问层设计模式

14

我需要设计一个在.NET上工作的数据访问层,可能会使用多个数据库管理系统(如Mysql和Sql Server),但这些数据库将拥有相同的关系设计。

基本上,设计需要简单易用地可以从一个数据库切换到另一个,我希望你能推荐一些对你有用过的网站或书籍,其中包含常用的设计模式或一般信息以实现这种类型的数据访问层。

谢谢。

7个回答

12

我目前正在阅读这本书,我可以全心全意地推荐它!它真的很棒!+1 - Sander Versluys

8

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

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;
}

接下来,当您需要与数据库进行通信时:

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。当然,在某些复杂情况下这是不够的。但大多数情况下这就足够了,您不需要各种外部库。


2

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


@Bob:ORM很好,但他的问题并不需要它;只需要切换数据库。任何ADO.NET技术都可以为他完成这项工作。 - John Saunders
据我所知,ADO.NET不会解决PL/SQL和TSQL之间的差异。一个好的ORM提供抽象并为您处理SQL部分。 - Johnno Nolan

2
总体而言,我支持John Nolan的建议,即使用Enterprise Application Architecture模式

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

您可以使用依赖注入容器或手动执行

在技术方面,考虑到您的数据访问需求似乎受到关系型数据库的限制,我建议使用Microsoft的Entity Framework。 Entity Framework是微软的官方OR/M,它提供了许多不同RDBMS的提供程序,以及LINQ支持。

1

这真的取决于您的层大小和正在开发的产品类型。如果它相当完整,那么ADO.NET可能是理想的选择。如果它是一个更大的DAL层,并且它是多目标dbms的绿地开发,最好使用ORM工具。它们是快速、高效和成熟的产品,可以通过更改单个参数快速启用重新定位到另一个数据库。编写静态ADO已经成为过时的技术。

有几个ORM工具可以完成这项工作,它们都略有不同,取决于您的预算、团队规模等因素。它们可以通过编写像NHibernate这样的映射类来工作,也可以通过反射来工作,即属性标记。

如果您的预算有限,即开源免费,那么NHibernate是理想的选择。我目前正在使用它来构建大型企业产品的DAL层。它非常出色,但需要一些时间来掌握。使用NHibernate,您定义映射类,当执行时会为您生成数据库模型。它支持存储过程。缺点是需要花费一些时间来正确地映射复杂数据,特别是在学习方面。它有大量的示例和其他项目可供使用。请查看Koders.com。

如果您有一些预算,那么LLBLGen是理想的选择。它是强类型的,还支持存储过程。
如果已经有一些数据模型可用,那么TierDeveloper是理想的选择。它基本上是免费的,并通过从数据库模型开发一组类来工作。唯一的缺点是mysql的映射器是第三方的。它是一个企业级产品,已经被免费提供以支持ncache,这是一个可能的方法。
如果您迫切希望坚持使用MS,则可以使用ORM,并且有一个名为ADO.NET Entity Framework的产品。功能上不如上述工具完整。它在成熟度方面落后了大约3代。它在vs 2008 sp1中可用。mysql的连接器将是一个成本。
此外,您还可以使用LINQ。如果您还需要连接器,它也将针对mysql进行目标设置。
理想情况下,您最好选择ORM。如果您无法支持开源并且有预算,那么就选择LLBLGen吧。
希望这能帮到您。

0

我发现ADO.NET在这方面非常有用。它具备创建与所使用的数据库无关的数据访问层所需的所有功能。


0

如果你愿意学习,NHibernate旨在处理这种情况。


标准的 DataSet 类也处理这种情况,不是吗? - John Saunders
是的,你说得对,但NHibernate为你提供了更高层次的抽象(例如,你不再编写SQL,而是使用NHibernate的内置查询语言或LINC(当它可用时)),并且使数据模型在另一个数据库引擎上移植变得更容易一些。 - oscarkuo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接