此模式可以很好的更换程序使用不同的数据库
1.用到的属性类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { class User { public int Id { get; set; } public String Name { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { class Department { public int Id { get; set; } public string DepartmentName { get; set; } } }
2.接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { interface IUser { void InsertUser(User user); User GetUser(int id); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { interface IDepartment { void InsertDepartment(Department department); Department GetDepartment(int id); } }
3.实现接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { class SqlServerUser:IUser { public void InsertUser(User user) { Console.WriteLine("sql server insert user " + user); } public User GetUser(int id) { Console.WriteLine("sql server get user " ); return null; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { class SqlServerDepartment:IDepartment { public void InsertDepartment(Department department) { Console.WriteLine("sql server insert department"); } public Department GetDepartment(int id) { Console.WriteLine("sql server get department"); return null; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { class OracleUser:IUser { public void InsertUser(User user) { Console.WriteLine("oracle inser user"); } public User GetUser(int id) { Console.WriteLine("oracle get user"); return null; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ReflectionAndAbstractFactor { class OracleDepartment:IDepartment { public void InsertDepartment(Department department) { Console.WriteLine("oracle insert department"); } public Department GetDepartment(int id) { Console.WriteLine("oracle get department"); return null; } } }
4.反射
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Configuration; namespace ReflectionAndAbstractFactor { class DataAcess { private static readonly string assemblyName = "ReflectionAndAbstractFactor"; //private static readonly string db = "SqlServer"; private static readonly string db = ConfigurationManager.AppSettings["db"].ToString(); public static IUser CreateUser() { string className = assemblyName + "." + db + "User"; return (IUser)Assembly.Load(assemblyName).CreateInstance(className); } public static IDepartment CreateDepartment() { string className = assemblyName + "." + db + "Department"; return (IDepartment)Assembly.Load(assemblyName).CreateInstance(className); } } }
5.使用
private void button1_Click(object sender, EventArgs e) { User user=new User(); user.Name="user name"; user.Id=1; IUser _User = DataAcess.CreateUser(); _User.InsertUser(user); _User.GetUser(1); Department department=new Department(); department.DepartmentName = "department name"; department.Id = 66; IDepartment _Department = DataAcess.CreateDepartment(); _Department.InsertDepartment(department); _Department.GetDepartment(6); }