做了技术这些年,自己总结的架构

  我自己总结的有的在博客园中借鉴不少,最后自己又整改了些东东。望各位前辈指点一二。


上面这个效果图就是我搭建的基础架构,

Common这个顾名思义就是帮助类。这里不在进行过多的讲解。

AbstractFactory这个类库是抽象该工厂,我想好多人都能猜到他是反射出下面的OrcalDAL和SQLDAL的,重要代码如下。

        public static object CreateDAL(string assemblyPath, string objType,  string type)
        {
            Type typ =typeof(T);
            object cacheDao = DALCache.GetDao(typ.Name + type);
            if (cacheDao == null)
            {
                if (type.Equals("SQL"))
                {
                    cacheDao = Activator.CreateInstance<Poetry.SQLDAL.BaseService<T>>();
                }
                else 
                {
                    cacheDao = Assembly.Load(assemblyPath).CreateInstance(objType);
                }


                DALCache.InsertDaoCache(typ.Name, cacheDao);
            }
            return cacheDao;
        }

  看到里面我实用了,泛型+反射来映射出相应的数据访问层,我这里把他写死了,因为泛型加上+反射我没有找到更好的方式,如果有哪位前辈提出来,那更好了。那我这里无论外面你怎么添加数据访问层,那么我这里都不需要修改了。

IDAL类库,他是网站数据访问层的接口,你要是想更改个数据库,那你完全不用管,其他操作,那你只要实现我这个接口中的类库,那么就OK了。

同样接口类我也是用了,泛型类。

   public interface IBaseDAL<T> where T : class, new()
    {
        /// <summary>
        /// 取得实体集合
        /// </summary>
        /// <param name="conditions">条件</param>
        /// <param name="pageSize">页面大小</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderByStr">排序</param>
        /// <param name="recCount">总数量</param>
        /// <returns>实体集合</returns>
        IList<T> GetList(string conditions, int pageSize, int pageIndex, string orderByStr, out int recCount);
     }

  而数据访问层怎么实现啊,居上可知道也是是用类的泛型动态传递实体类的。那我们就看下SQLDAL类库的代码吧。

 public class BaseService<T> : IBaseDAL<T> where T : class, new()
    {
        /// <summary>
        /// 取得实体集合
        /// </summary>
        /// <param name="conditions">条件</param>
        /// <param name="pageSize">页面大小</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderByStr">排序</param>
        /// <param name="recCount">总数量</param>
        /// <returns>实体集合</returns>
        public IList<T> GetList(string conditions, int pageSize, int pageIndex, string orderByStr, out int recCount)
        {
            if (CheckKeyWord(orderByStr))
                throw new Exception("conditions或者orderByStr包含有非法字符");
            if (string.IsNullOrEmpty(orderByStr))
                orderByStr = "ORDER BY ID DESC";

            string sp = "SP_GetListByPage";
            SqlParameter[] pc = new SqlParameter[]{
                new SqlParameter("@tablename",typeof(T).Name),
                new SqlParameter("@fields","*"),
                new SqlParameter("@orderstr",orderByStr),
                new SqlParameter("@wherestr",conditions),
                new SqlParameter("@pagesize",pageSize),
                new SqlParameter("@pageindex",pageIndex)};

            IList<T> list;
            using (SqlDataReader reader = DBHelper.GetReader(sp, CommandType.StoredProcedure, pc))
            {
                Materializer<T> m = new Materializer<T>();
                list = m.Materialize(reader).ToList<T>();
                if (list != null && reader.NextResult())
                {
                    reader.Read();
                    recCount = Convert.ToInt32(reader["RecCount"]);
                }
                else
                    recCount = 0;
            }

            return list;
        }
}

  我在这里巧妙的运用了Materializer类库,他是一个我在网上找到的类库,他使我们开发程序是写过多的reader["field"],有的时候如果字段过多,会出现错误,从而影响开发进度。

同样的实现了OrcaleDAL类库,它里面结构和SQLDAL一样。第一幅图片里面可以体现出来,这里就不在过多讲解。

总之,就是泛型+反射+抽象工厂的实用。这是我自己写的,请各位多提意见。

由于项目正在进行,所以不能放过多的代码抱歉,但是我感觉我已经把精髓告之大家了。如果有什么建议或者需要,请留言啊。


如果转载请标注http://www.cnblogs.com/waters/archive/2012/07/24/2607290.html 

posted @ 2012-07-24 22:01  rains  阅读(1304)  评论(4编辑  收藏  举报