ADO.NET Entity Framework多库架构初探(一)

底层架构如上

Model

1.Model.UC Model.Stock Model.PSS,是对应的三个库,edmx文件的建立就不说了

2.Model.Comm是和前台交互的josn类 内容比较简单

    public class JsonList<T> where T : class
    {
        public long count { get; set; }
        public IList<T> root { get; set; }
    }
    public class JsonResult
    {
        public bool result { get; set; }
        public string message { get; set; }
    }


BLL

1.BLL.Base  逻辑管理的基类,实现一些常用的方法

 

 ManageBase.cs

public abstract class JsonManager<T> where T : class
    {
        public abstract ObjectContext DB { get; }

        #region getlist重载
        public virtual JsonList<T> getlist(int s, int l)
        {
            return getlist(s, l, null, null);
        }

        public virtual JsonList<T> getlist(int s, int l, string sorts)
        {
            return getlist(s, l, null, sorts);
        }

        public virtual JsonList<T> getlist(int s, int l, Expression<Func<T, bool>> where)
        {
            return getlist(s, l, where,null);
        }
        #endregion

        public virtual JsonList<T> getlist(int s, int l, Expression<Func<T, bool>> where, string sorts)
        {
            JsonList<T> ret = new JsonList<T>();
            //var query = DB.CreateObjectSet<T>().AsQueryable();
            var query = DB.CreateObjectSet<T>().AsEnumerable();

            //query.Expression = DynamicExpression

            Sort[] sort;
            #region 解析sort
            if (string.IsNullOrEmpty(sorts))
                sort = new Sort[] { new Sort() { property = "id", direction = "DESC" } };
            else
            {
                sort = JsonConvert.DeserializeObject<Sort[]>(sorts);
            }
            #endregion

            foreach (Sort st in sort)
            {
                //query = query.OrderBy(st.property + " " + st.direction);
                if(st.direction.ToLower()=="asc")
                    query = query.OrderBy(a => typeof(T).GetProperty(st.property));
                else
                    query = query.OrderByDescending(a => typeof(T).GetProperty(st.property));
            }
            if (where != null)
                query = query.Where(where.Compile());
            ret.count = query.LongCount();
            query = query.Skip(s).Take(l);
            ret.root = query.ToList();
            return ret;
        }

        public virtual JsonResult Save(T o)
        {
            JsonResult ret = new JsonResult() { result = true };

            try
            {
                ObjectSet<T> oset = DB.CreateObjectSet<T>();
                oset.AddObject(o);
                oset.Context.SaveChanges();
                ret.message = o.GetType().GetProperty("id").GetValue(o, null).ToString();
            }
            catch (Exception e) { ret.result = false; ret.message = e.Message; }
            return ret;
        }

        public virtual JsonResult Delte(IList<int> ids)
        {
            JsonResult ret = new JsonResult() { result = true };
            try
            {
                ObjectSet<T> o = DB.CreateObjectSet<T>();
                foreach(int i in ids)
                {
                    o.DeleteObject(o.Where("id==@0", i).Single());
                }                
                o.Context.SaveChanges();
            }
            catch (Exception e) { ret.result = false; ret.message = e.Message; }
            return ret;
        }

        public virtual T GetObjeteByID(int id)
        {
            T ret = null;
            try
            {
                ret = DB.CreateObjectSet<T>().Where("id==@0", id).Single();
            }
            catch { }
            return ret;

        }


 PredicateBuilder.cs

public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }


2 BLL.PSS

public abstract class ManagerBase<T> : xsuda.BLL.Base.JsonManager<T> where T : class
    {
        public override ObjectContext DB { get { return new PSSEntities(new PSSConn().conn); } }

        public JsonList<T> GetObjectList(int start, int limit, int accountid, string sort)
        {
            var query = PredicateBuilder.True<T>();
            query = query.And(DynamicExpression.ParseLambda<T,bool>("accountid == @0",accountid));
            //query = query.And<T>(o => (int)typeof(T).GetProperties().Where(x=> x.Name == "accountid").First().GetValue(o,null) == accountid);
            return base.getlist(start, limit, query, sort);
        }
    }

 

至此所有PSS下的管理类继承ManagerBase即可,如下

public class ManageProduct:ManagerBase<tbProduct>
    {
        
    }

BLL结构结束

 

应用层可直接

new ManageProduct().GetObjeteByID(1)

 

如果有其他方法,可以根据适用情况添加到各管理类中

product独有方法添加到 ManageProduct 

PSS中各个类公用方法添加到 ManagerBase<T>

各个库公用方法添加到JsonManager<T>

介绍结束,如有其他更好方式,还请指教。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值