在某些情况下,要返回某个数据库表中的数据,如要返回Customers中的数据,就要写一个return List<Customers>,如果有100张表的话,将会写100个这样的方法。
于是想到了使用List<T>来作为数据的容器,当在界面上传了具体的类型后通过反射去创建接口并使用具体的类型到List中,然后返回数据.这样就减少了大量的代码。
1.在数据访问层,使用一个泛型接口定义要做的功能
namespace DataAccess
{
/// <summary>
/// 业务逻辑层访问数据库的接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IAccessDB<T> where T : class //T代表类型参数,where后面是类型约束
{
/// <summary>
/// 添加数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
int Add(T entity);
/// <summary>
/// 取得该对象数据表中的所有数据
/// </summary>
/// <returns></returns>
IList<T> GetTAll();
}
}
2.实现接口
/// <summary>
/// 实现IAccessDB接口
/// </summary>
/// <typeparam name="T"></typeparam>
class AccessDB<T> : IAccessDB<T> where T : class
{
#region 构造函数
public AccessDB()
{
}
#endregion
#region 虚方法实现多态;子类可以初始化父类
public virtual ObjectContext GetObjectContext()
{
return new NorthwindEntities();
}
#endregion
#region IAccessDB<T> 成员
public int Add(T entity)
{
throw new NotImplementedException();
}
public IList<T> GetTAll()
{
using (var objectContext=GetObjectContext())
{
//创建新的 System.Data.Objects.ObjectSet<TEntity> 实例,
//该实例用于查询、添加、修改和删除指定实体类型的对象。
var list = objectContext.CreateObjectSet<T>();
return list.ToList();
}
}
#endregion
}
3.工厂类
public class DataAccessFactory
{
private readonly IDictionary<String, Object> factory = new Dictionary<String, Object>();
private static DataAccessFactory instance;//写这个就是实现单件模式
/// <summary>
/// 返回数据访问层对对象的实例
/// </summary>
/// <returns></returns>
public static DataAccessFactory GetInstance()
{
if (instance == null)
instance = new DataAccessFactory();//为空就实例化
return instance;
}
public IAccessDB<T> GetAccessDBObj<T>() where T : class //泛型方法
{
Type t = typeof(T);//用于获取类型的 System.Type 对象
if (factory.ContainsKey("YOYO" + t.FullName))
return factory["YOYO" + t.FullName] as IAccessDB<T>;//强转成泛型接口;写这个的用意同时表示把之前类型放到字典中,以避免重复调用反射创建接口的实例;因为调用反射会有性能上的损耗
else
{
string className = "DataAccess.AccessDB`1";
className += "[[" + t.FullName + "," + t.Assembly.FullName + "]]";
Type type = Type.GetType(className);//获取该类名称的类型
IAccessDB<T> accessDB = Activator.CreateInstance(type) as IAccessDB<T>;
factory.Add("YOYO" + t.FullName, accessDB);
return accessDB;
}
}
}
4.业务逻辑层的调用方式
public IList<T> GetTableList<T>() where T : class
{
IAccessDB<T> accessDB = DataAccessFactory.GetInstance().GetAccessDBObj<T>();
IList<T> list = accessDB.GetTAll();
return list;
}
5.界面调用
OperateDAL bll = new OperateDAL();
this.GridView1.DataSource = bll.GetTableList<Customers>();
this.GridView1.DataBind();