原來寫過一篇三層架構之泛型應用的簡單登陸,已通過去2年了,今天有一朋友問我關於抽象工廠的問題,就把本身後來解耦的方法從項目中拿出來了,方便你們學習。html
我從新寫了一個例子項目,以下截圖:安全
XU.Model層中有一個抽象類BaseModel.cs,User.cs是用戶實體類,繼承與BaseModel類,是用於類型安全考慮的架構
1 using System; 2 3 namespace XU.Model 4 { 5 public abstract class BaseModel 6 { 7 } 8 }
1 using System; 2 3 namespace XU.Model 4 { 5 public class User : BaseModel 6 { 7 public string UserName { set; get; } 8 public string Password { set; get; } 9 } 10 }
XU.FactoryDAL層是用於反射獲取實例,其中只有一個類app
1 using System; 2 3 namespace XU.FactoryDAL 4 { 5 public class DataAccess<T> where T : class 6 { 7 //獲取配置路徑 8 private static readonly string path = System.Configuration.ConfigurationManager.AppSettings["DAL"]; 9 private DataAccess() { } 10 11 /// <summary> 12 /// 建立實例 13 /// </summary> 14 /// <param name="type"></param> 15 /// <returns></returns> 16 public static T CreateDAL(string type) 17 { 18 string className = string.Format(path + ".{0}", type); 19 try 20 { 21 return (T)System.Reflection.Assembly.Load(path).CreateInstance(className); 22 } 23 catch (Exception ex) 24 { 25 throw new Exception(ex.Message.ToString()); 26 } 27 } 28 } 29 }
XU.IDAL層依賴與XU.Model,其中包含一個基接口IBaseDAL.cs,還有一個用於定義一些基接口中沒有方法的接口IUserDAL,繼承與基接口IBaseDAL<T>ide
1 using System; 2 3 namespace XU.IDAL 4 { 5 public interface IBaseDAL<T> where T : XU.Model.BaseModel, new() 6 { 7 bool Add(T model); 8 bool Delete(int ID); 9 bool Update(T model); 10 T GetModel(int ID); 11 } 12 }
1 using System; 2 3 namespace XU.IDAL 4 { 5 public interface IUserDAL : IBaseDAL<XU.Model.User> 6 { 7 /// <summary> 8 /// 判斷用戶名是否存在 9 /// </summary> 10 /// <param name="userName"></param> 11 /// <returns></returns> 12 bool Exists(string userName); 13 } 14 }
實現XU.IDAL中接口有2個類庫,一個是MSSQL方案,一個是MYSQL方案,這2個類庫都依賴於XU.Model和XU.IDAL,下面是實現方案post
XU.MSSQLDAL的實現以下學習
1 using System; 2 3 namespace XU.MSSQLDAL 4 { 5 public class UserDAL : XU.IDAL.IUserDAL 6 { 7 public bool Exists(string userName) 8 { 9 return true; 10 } 11 12 public bool Add(Model.User model) 13 { 14 return true; 15 } 16 17 public bool Delete(int ID) 18 { 19 return true; 20 } 21 22 public bool Update(Model.User model) 23 { 24 return true; 25 } 26 27 public Model.User GetModel(int ID) 28 { 29 return new XU.Model.User() { UserName = "MSSQL", Password = "123456" }; 30 } 31 } 32 }
XU.MYSQLDAL的實現以下測試
1 using System; 2 3 namespace XU.MYSQLDAL 4 { 5 public class UserDAL : XU.IDAL.IUserDAL 6 { 7 public bool Exists(string userName) 8 { 9 return false; 10 } 11 12 public bool Add(Model.User model) 13 { 14 return false; 15 } 16 17 public bool Delete(int ID) 18 { 19 return false; 20 } 21 22 public bool Update(Model.User model) 23 { 24 return false; 25 } 26 27 public Model.User GetModel(int ID) 28 { 29 return new XU.Model.User() { UserName = "MYSQL", Password = "123456" }; 30 } 31 } 32 }
XU.BLL業務邏輯層中包含了一個用於繼承的基類BaseBLL<T>和用戶業務邏輯UserBLL類,這層依賴XU.IDAL,XU.Model,XU.FactoryDAL庫網站
1 using System; 2 3 namespace XU.BLL 4 { 5 public class BaseBLL<T> where T : XU.Model.BaseModel, new() 6 { 7 protected XU.IDAL.IBaseDAL<T> Dal; 8 public BaseBLL(string type) 9 { 10 Dal = XU.FactoryDAL.DataAccess<XU.IDAL.IBaseDAL<T>>.CreateDAL(type); 11 } 12 public virtual bool Add(T model) 13 { 14 return Dal.Add(model); 15 } 16 public virtual bool Delete(int ID) 17 { 18 return Dal.Delete(ID); 19 } 20 public virtual bool Update(T model) 21 { 22 return Dal.Update(model); 23 } 24 public virtual T GetModel(int ID) 25 { 26 return Dal.GetModel(ID); 27 } 28 } 29 }
1 using System; 2 3 namespace XU.BLL 4 { 5 public class UserBLL : BaseBLL<XU.Model.User> 6 { 7 private const string _Type = "UserDAL"; 8 private XU.IDAL.IUserDAL _Dal; 9 10 public UserBLL() 11 : base(_Type) 12 { 13 _Dal = base.Dal as XU.IDAL.IUserDAL; 14 if (_Dal == null) 15 { 16 throw new NullReferenceException(_Type); 17 } 18 } 19 20 public bool Exists(string userName) 21 { 22 return _Dal.Exists(userName); 23 } 24 } 25 }
XU.ConsoleDemo是一個控制檯程序,本準備弄一個網站測試,以爲麻煩,用這個講解抽象工廠更簡單和直觀url
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <!--DAL路徑--> <add key="DAL" value="XU.MYSQLDAL"/> </appSettings> </configuration>
1 using System; 2 3 namespace XU.ConsoleDemo 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 XU.BLL.UserBLL userBLL = new XU.BLL.UserBLL(); 10 XU.Model.User user=new XU.Model.User(); 11 int id = 1; 12 Console.WriteLine("添加------{0}", userBLL.Add(user)); 13 Console.WriteLine("刪除------{0}", userBLL.Delete(id)); 14 Console.WriteLine("更新------{0}", userBLL.Update(user)); 15 XU.Model.User model = userBLL.GetModel(id); 16 Console.WriteLine("查詢\n用戶名:{0}\n密碼:{1}", model.UserName, model.Password); 17 Console.ReadLine(); 18 } 19 } 20 }
注意:XU.ConsoleDemo是不會直接引用XU.MSSQLDAL和XU.MYSQLDAL的,可是XU.ConsoleDemo中的Debug目錄下要把編譯好的XU.MSSQLDAL.dll和XU.MYSQLDAL.dll放進去,若是是網站就要放入網站中的Bin文件夾下
以上就完成了抽象工廠的實現,是否是很簡單,你們相互交流學習,如想討論,請加羣83455635
如發現哪裏不足,請留言,謝謝!