Service之后

Service之后紧接着就是一堆的单元测试。下面列出在Service中编写实现类的一些问题:

①、 在编写GetById()时应当检测的是Get的对象是否为null,因为Id是唯一的,所以得到的数据非“0”即“1”,,而在GetByPhoneNum()时则要检测数据的重复性,对于GetAll(),直接return,对于Update()使用EF时应当先把原来的数据删了再更新。

          var users = bs.GetAll().Include(u => u.City).AsNoTracking().Where(u => u.PhoneNum == phoneNum);
                int count = users.Count();
                if(count<=0)
                {
                    return null;
                }
                else if(count ==1)
                {
                    return ToDTO(users.Single());
                }
                else
                {
                    throw new ApplicationException("找到多条手机号为" + phoneNum + "的管理员");
                }
          var user = bs.GetAll().Include(u => u.City).AsNoTracking().SingleOrDefault(u => u.Id == id);
                if(user==null)
                {
                    return null;
                }
                return ToDTO(user);

②、AsNoTracking()的作用:https://www.cnblogs.com/zhaopei/p/5721789.html

  • AsNoTracking干什么的呢?无跟踪查询而已,也就是说查询出来的对象不能直接做修改。所以,我们在做数据集合查询显示,而又不需要对集合修改并更新到数据库的时候,一定不要忘记加上AsNoTracking
  • AsNoTracking和Select无关系。

 如果对于不需要修改的数据可以使用AsNoTracking()方法,对于使用AsNoTracking()的数据不能用于修改。

③、Linq延迟执行:http://www.cnblogs.com/lifepoem/archive/2011/10/29/2228589.html使用ToList、ToArray的目的是为了避免重复查询,ToArray把查询结果保存至一个Array,而ToList把结果保存至泛型List<>

④、实现一个ToDTO()应当声明为private

⑤、当用id查询到的数据为null时,应该抛一个ArgumentException;当用别的属性(非id)查询时,数据重复,应当抛个ApplicationException

⑥、单元测试的时候应当自己捕获异常,然后自己在catch中throw,这样才能看到异常信息

⑦、Where返回的IQueryable,IQueryable只有一些方法,因此点不出返回的元素的属性或方法(类型1 p =new 类型2)p有什么方法、属性是由类型1决定的,方法的实现则是由类型2中定义的方法去完成

SingleOrDefault返回的类型则是序列中元素的类型(<TSource>),因此可以点出元素的方法和属性

原文地址:https://www.cnblogs.com/HuShaoyi/p/8544841.html