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





5.00/5 (9投票s)
在本文中,我们将演示使用模板模式重用 ADO.NET。
目录
- 引言
- 理解问题
- 步骤 1:创建基类
- 步骤 2:使其通用化
- 步骤 3:抽象受保护和虚拟方法
- 步骤 4:将某些方法设为私有
- 步骤 5:继承并创建具体类
- 你就成功运用了模板设计模式
- 模板设计模式的另外六种用途
引言
设计模式以各种形式存在于所有代码中。很多时候,我们会在不知不觉中使用这些模式。但提前了解它们可以防止您重复发明轮子。
通过本文,我想分享一次成功使用模板模式重用 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();
}
}
你就成功运用了模板设计模式
模板模式属于行为模式类别。模板模式定义了一个主流程模板,该主流程模板以固定的顺序调用子流程(Open
、Execute
和 Close
)。此顺序无法更改。
之后,可以通过继承来扩展子流程,以创建不同类型的流程。
模板设计模式的另外六种用途
四年前,我曾就模板设计模式的另外六个有用场景写过博客。您可以从 这里 阅读更多相关内容。
- 场景 1:灵活可扩展的通用专用用户界面
- 场景 2:ASP.NET 页面生命周期
- 场景 3:代码生成器
- 场景 4:XML 解析器
- 场景 5:业务组件中的验证
- 场景 6:可定制的日志记录工具
如需进一步阅读,请观看以下面试准备视频和分步视频系列。