看到标题您一定很疑惑,23种经典设计模式什么时候多了一个"类工厂模式",稍等,请听我慢慢道来。
实践是检验真理的唯一途径。最近用了"类工厂模式"改写了我公司的SqlHelper类,改写了一大半了,拿出半成品和大家一起讨论。
首先说下我们公司环境:我公司在ABC三地都有工厂,同时都有各自的DB。经过调研,ABC三地的很多网页都有可有整合在一起的地方,我负责整合三地网页。
一开始,没接触设计模式的时候。我的Sql是这样写的:"select * from "+ strSite +".dbo.Table where Id='XXX'".Sql语句中的strSite是从URL中获得的公司别。
这样可以通过strSite来区分ABC工厂的数据库。我是这样调用SqlHelper类的:DBA.GetDataTable("select * from "+ strSite +".dbo.Table where Id='XXX'");
一个Sql中不可能只有一个表,每写一个表,我就要在前面加上"+ strSite +",如果这样整合下去。公用页面的逻辑复杂了,而且在调试Sql语句的时候更是麻烦,经常因为少些后面的架构,或者多写DB的名称,导致系统报错。
知道了错误,就需要从错误中改变,我发现Sql中的strSite只是提供了一种环境,例如,strSite=A的时候,即为在A公司的DB中执行Sql,在B和C公司,同样是执行Sql的环境变了。
那我可不可以传一个参数,在SqlConnection的时候,动态的选择不同的Sql环境。
咱爷们说干就干,于是就有了下面的代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Data.SqlClient; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 public class DBAStore 9 { 10 private static string AConnection = "A公司连接字符串"; 11 private static string BConnection = "B公司连接字符串"; 12 private static string CConnection = "C公司连接字符串"; 13 14 15 public SqlConnection OrderSqlConnection(string strSite) 16 { 17 return GetConnection(strSite); 18 } 19 20 // 获取SqlConnection方法 21 22 private static SqlConnection GetConnection(string strSite) 23 { 24 switch (strSite) 25 { 26 case "A": 27 return new SqlConnection(AConnection); 28 case "B": 29 return new SqlConnection(BConnection); 30 case "C": 31 return new SqlConnection(CConnection); 32 default: 33 return null; 34 } 35 } 36 }