65.9K
CodeProject 正在变化。 阅读更多。
Home

使用模板设计模式重用 ADO.NET 代码

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2015 年 7 月 17 日

CPOL

5分钟阅读

viewsIcon

25337

在本文中,我们将演示使用模板模式重用 ADO.NET。

目录

引言

设计模式以各种形式存在于所有代码中。很多时候,我们会在不知不觉中使用这些模式。但提前了解它们可以防止您重复发明轮子。

通过本文,我想分享一次成功使用模板模式重用 ADO.NET 基本代码的经历。

学习设计模式的最佳方法是做一个项目。我鼓励您阅读这个系列文章 通过项目逐步学习 C# 设计模式

理解问题

所以,让我们来理解这个问题。如果您查看下面的 ADO.NET 数据访问层代码,它正在将“Customer”对象添加到数据库。如果您可视化代码,我们会执行以下步骤:

  • 打开 ADO.NET 连接并提供连接字符串。
  • 创建命令,编写 SQL 并执行 SQL。
  • SQL 执行后,我们关闭连接。
public class CustomerDataLayer
{
public void Add(Customer obj)
{

//Step 1 :- Open connection
SqlConnection  objConnection = new SqlConnection(@"Connectionstring");
objConnection.Open();
SqlCommand objCommand = new SqlCommand();
objCommand.Connection = objConnection;

//Step 2:- Execute SQL
objCommand.CommandText = "insert into tblCustomer values('" 
                          + obj.CustomerName + "','" 
                           + obj.CustomerCode + "')";
objCommand.ExecuteNonQuery();

//Step 3:- Close connection
objConnection.Close();      
}
}

如果您分析一下,上述代码中有以下是通用的:

  • 步骤顺序,即打开连接、执行 SQL 和关闭连接,对于所有 ADO.NET 调用都是相同的。
  • 打开和关闭连接对象的代码对于所有实体都是相同的。唯一改变的是 SQL 语句。

那么现在的问题是如何在创建其他对象(如“Customer”、“Supplier”等)的数据访问层时重用连接对象和步骤顺序?

步骤 1:创建基类

所以,逻辑上首先想到的是创建一个基类,其中包含上面讨论的通用部分,即顺序和用于打开和关闭连接的通用连接代码。

上面是一个简单的基类,它有四个方法:“Open”、“ExecuteSql”、“Close”和“Execute”。

在“Open”和“Close”方法中,我们有创建 connection 对象、打开它和关闭它的通用代码。

在“ExecuteSql”方法中,我们将传递“Customer”对象,这将有助于我们执行 CRUD 操作。

在“Execute”方法中,我们有调用上述三个方法的顺序。没有人能够改变这个顺序,因为这个顺序是固定的。

public void Open()
{
objConnection = new SqlConnection(@"Connectionstring");
objConnection.Open();
objCommand = new SqlCommand();
objCommand.Connection = objConnection;
}
public void Close()
{
 objConnection.Close();
}

逻辑上想一下,如果您想添加供应商、账户和其他不同类型的实体,您将需要另外 10 个这样的基类,这绝对不是一个好的设计。

步骤 2:使其通用化

为了避免为多种实体类型创建多个基类,让我们将基类“通用化”。如果您不熟悉泛型,并且认为泛型只是泛型集合,您应该观看这个 C# 泛型视频

您可以在下面的代码中看到,基类现在是通用的,并且可以与任何实体类型一起使用。我们不需要为不同类型创建不同的基类。

步骤 3:抽象受保护和虚拟方法

现在,上面的类定义了步骤顺序和通用连接代码,但不同实体的 SQL 是不同的。这意味着这个类是一个未完全定义的类。所以,表示这类类的最佳方式是将其设为“抽象”,并将“ExecuteSql”方法设为“抽象方法”。

通过将此类设为 abstract,没有人可以创建该类的对象,并且通过将“ExecuteSql”方法定义为 abstract,子类必须在下面的子类中定义此方法。

为了让子类能够编写 SQL 并执行它们,我们需要公开连接和命令对象。所以您可以看到连接和命令对象被设为 protected

步骤 4:将某些方法设为私有

Open”和“Close”方法只能通过“Execute”方法调用,而且必须遵循特定的顺序和次序。因此,将这些方法设为 public 会有害,因为它们可以在不遵循该顺序的情况下被调用。所以将这些方法设为 private 可以防止在顺序之外进行此类调用。

步骤 5:继承并创建具体类

现在我们的 BASE ABSTRACT GENERIC 类已经完成,我们可以从这个未完全定义的类继承,并将域类与之关联。

所以,如果您想为 customer 实体编写 CRUD 操作,您将继承并将类附加到通用的 abstract 类,然后编写 CRUD 逻辑。

public class CustomerDal : AbstractDal<customer>
    {

public override void ExecuteSql(Customer obj)
        {
objCommand.CommandText = "insert into tblCustomer values'("
                                        + obj.CustomerName + "')";
objCommand.ExecuteNonQuery();
        }
    }
</customer>

我们也可以为 supplier 类和任何其他类型的实体类做同样的事情。

public class SupplierDal : AbstractDal<supplier>
    {
        public override void ExecuteSql(Supplier obj)
        {
objCommand.CommandText = "insert into tblSupplier values'("
                                       + obj.SupplierName + "')";
objCommand.ExecuteNonQuery();
        }
    }

你就成功运用了模板设计模式

模板模式属于行为模式类别。模板模式定义了一个主流程模板,该主流程模板以固定的顺序调用子流程(OpenExecuteClose)。此顺序无法更改。

之后,可以通过继承来扩展子流程,以创建不同类型的流程。

模板设计模式的另外六种用途

四年前,我曾就模板设计模式的另外六个有用场景写过博客。您可以从 这里 阅读更多相关内容。

  • 场景 1:灵活可扩展的通用专用用户界面
  • 场景 2:ASP.NET 页面生命周期
  • 场景 3:代码生成器
  • 场景 4:XML 解析器
  • 场景 5:业务组件中的验证
  • 场景 6:可定制的日志记录工具

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.