DALFactory与IDAL的区别

分类:.Net知识问答| 发布:camnprbubuol| 查看: | 发表时间:2011/4/29

 

 

业务逻辑层调用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;

        }}

365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/net-wiki/280.html