架构之旅~底层提供一个统一的GetModel()的重要性

在我们开始项目过程中,项目中通常会存在几个主要的对象,如你在设计“B2C”时,可能主要对象是“用户对象”,“产品对象”,“订单对象”,而这些对象的信息应该对我们来说是很重要的,当用户删除自己的产品时,我们可能不希望产品真的从数据库中被删除除,这时,我们在设计数据库时可能会把这几个对象所对应的表加上“状态”字段,即Status,它通常是int32类型的,而在程序中一般会对应一个枚举类型,你当然可以也叫它Status

而今天要讲的GetModel()它只是本人封装的一个方法,它会在DATA层出现,为每个带个Status属性的对象实现一个GetModel()方法,而这个方法中我们会过滤一些统一的条件,如过滤掉被删除的对象,过滤掉登陆不活跃的对象等等,而这些操作通常具有统一性,即,它对前台所有业务都是一样的,也就是说:BLL(业务层)再进行查询组合时,不会直接从数据源中读取,而是从DATA层提供的GetModel()中去读取,这样的好处很容易理解,就是实现了调用上的“统一”,当我们要修改“过滤的条件”时候,只要修改DATA层的GetModel()方法即可。

核心代码如下:

 1  public class UserRepository : TestRepositoryBase
 2     {
 3         /// <summary>
 4         /// 得到默认的结果集
 5         /// </summary>
 6         /// <returns></returns>
 7         public IQueryable<User> GetModel()
 8         {
 9             return _db.Set<User>()
10                 .Where(i => i.Status != (int)Status.Deleted)
11                 .OrderByDescending(i => i.ID);
12         }
13     }

而在BLL层进行条件组合查询时,可以直接调用GetModel(),而不要自己在BLL层再使用以下的方法:

 1      /// <summary>
 2         /// 业务层得到完整的用户信息
 3         /// </summary>
 4         /// <returns></returns>
 5         public IQueryable<User> GetUser()
 6         {
 7             var linq = from data1 in _db.Set<User>().Where(i => i.Status != (int)Status.Deleted).OrderByDescending(i => i.ID)
 8                        join data2 in _db.Set<User_Profile>() on data1.ID equals data2.ID
 9                        select data1;
10             return linq;
11         }

我想大家已经看到了上面方法的不足之处,当有第二个业务用到User对象时,你还要重要去组装你的条件,而使用GetModel()我们在业务层不用去管数据有效性

这方法的基础过滤工作。

原文地址:https://www.cnblogs.com/lori/p/2775450.html