数据访问层设计模式

时间:2009-06-28 20:43:05

标签: .net database design-patterns oop

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

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

谢谢。

7 个答案:

答案 0 :(得分:12)

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

模式列表也在他的website

DataMapper模式也很重要。

答案 1 :(得分:8)

我喜欢使用基于界面的Db访问。 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;
}

然后,当您需要与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。当然,对于一些复杂的情况,这还不够。但大多数情况下这将完成工作,并且您不需要各种外部库。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

一般来说,我是John Nolan对Patterns of Enterprise Application Architecture的推荐。

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

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

在技术方面,我建议使用Microsoft的Entity Framework,因为您的数据访问需求似乎受限于关系数据库。实体框架是微软官方的OR / M,它提供了许多不同的RDBMS以及LINQ支持。

答案 4 :(得分:1)

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

有几种ORM工具可以完成这项工作,所有工作都略有不同,并且依赖 你的预算,团队规模等等。他们可以通过编写像NHibernate这样的映射类来工作,也可以通过反射来工作,即属性标记。

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

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

如果某些数据模型已经可用,那么TierDeveloper是理想的选择。它基本上是免费的,并且通过从数据库模型开发一组类来工作。唯一的缺点是mysql的mapper是第三方。它是一个企业级产品,可以自由支持ncache,它是一种可能的方法。

如果您迫切希望坚持使用MS,他们正朝着ORM迈进,并拥有一款名为ADO.NET Entity Framework的产品。从功能上讲,它不如上面定义的工具那么完整。它在成熟时落后约3代。它在vs sp1中可用。 mysql的连接器是一个成本。

此外,您可以使用LINQ。如果你还需要连接器,它也将以mysql为目标。

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

希望有所帮助。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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