业务逻辑层调用IDAL接口是对的,但说这里体现不了接口的优势是错的,这里正是体现接口优势的地方!
因为有了DAL层,软件可以轻易移植到不同种类的数据库上运行。不同种类数据库的具体编码不同,所以要分开实现,但无论数据库编码写么编,对于业务逻辑层来说,就是一个作用,保存数据!所以不同种类数据库DAL层都继承自IDAL,这样业务层就不用考虑调用的到底是哪种数据库来保存数据,只要按IDAL规定的方法存了就行。真正去存入数据库的时候,到底存到了哪种数据库里,就看对IDAL进行实例化的时候,生成的是哪种数据库的实例。
接口中定义了要用的方法,当调用接口时会根据具体的情况再去调用底层数据访问操作。而现在这个DALFactory就是关键,当BLL层要操作数据库时,DALFactory会根据具体情况再去使用SqlServerDAL和AccessDAL实现IDAL层的接口。(通过反射,动态生成访问类是PetShop.SQLServerDAL还是PetShop.OracleDAL命名空间中的类)。
web层-->BLL(使用Model)-->DALFactory(通过IDAL)-->具体DAL实现层(oracle或ms sql)-->持久存储。
BLL层是怎么用到DALFactory的呢???请看下面的代码!!!
private static readonly ICaiFang dal=DALFactory.DataAccess.CreatCaiFang();
BLL调用工厂,工厂创建类调用方法,就看怎么实现IDAL,他就怎么调用。
个人理解:BLL层只是调用方法,方法是IDAL规定,受IDAL约束,具体操作那种数据库看DALFactory生成的那种数据库的实例。(这样理解好像是错的,请看下面的解释)
IDAL 是 DAL层的类要实现的接口
DAL层的各类需要完成对数据库的访问,但是不同的数据库需要使用不同的DAL对象,这样对于BLL层来说 无法实现数据库无关性
为了实现数据库无关性 可以将DAL对象转化为他所实现的接口类型,这样就和具体的数据库访问对象无关了
也就是说说 DAL对象 实现IDAL接口 上层程序 在使用时不直接DAL对象,而是使用IDAL接口
这里接口提供了充分的灵活性。
这个接口是对不同数据库来的统一,就像是人,人可以是不同肤色,但他们都是人。人就像接口,不同肤色的人就是数据库。
DALFactory层:
public static T CreateObject<T>(string CacheKey)
{
T objType = DataCache.GetCache<T>(CacheKey);//从缓存读取
if (objType == null)
{
objType = (T)Assembly.Load(path).CreateInstance(CacheKey + "DAL"); 反射创建 IDAL下的DAL
DataCache.SetCache<T>(CacheKey, objType);// 写入缓存
}
return objType;
}
/// <summary>
/// 创建用户数据层接口
/// </summary>
/// <returns>IRegUser用户数据接口</returns>
public static IRegUser CreatRegUser()
{
string CacheKey = path + ".RegUser";
return CreateObject<IRegUser>(CacheKey); //IRegUser下的RegUserDAL
}
然后是其他数据层接口。
DAL层: public bool Add(CaiFang Model)
{
SqlParameter[] param = {
new SqlParameter ("@title",SqlDbType.VarChar,300),
new SqlParameter ("@time",SqlDbType.VarChar,50),
new SqlParameter ("@place",SqlDbType.VarChar,300),
new SqlParameter ("@Organization",SqlDbType.VarChar,300),
new SqlParameter ("@leader",SqlDbType.VarChar,200),
new SqlParameter ("@description",SqlDbType.VarChar,800)
};
param[0].Value = Model.Title;
param[1].Value = Model.Time;
param[2].Value = Model.Place;
param[3].Value = Model.Organization ;
param[4].Value = Model.Leader;
param[5].Value = Model.Description;
int rowAffected;
ProcCommander.RunProcedure("CaiFang_Add", param, out rowAffected);
return (rowAffected > 0);
}
IDAL层:
public interface ICaiFang
{
bool Add(CaiFang Model);
int Del(params int[] Id);
IList<CaiFang> GetCaiFangList(int PageSize, int PageIndex, string strWhere, out int conunt);
}
BLL层:
public class CaiFangBLL
{
private static readonly ICaiFang dal = DALFactory.DataAccess.CreatCaiFang();
public bool Add(Lgwin.Model.CaiFang Model)
{
return dal.Add(Model);
}
public int Del(params int[] ids)
{
return (dal.Del(ids));
}
public IList<CaiFang> GetCaifangByPage(int PageSize, int PageIndex, string strWhere, out int count)
{
IList<CaiFang> list = new List<CaiFang>();
list = dal.GetCaiFangList(PageSize, PageIndex, strWhere, out count);
return list;
}}