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。
- 如果查询过程做了select映射就不需要加AsNoTracking。如:db.Students.Where(t=>t.Name.Contains("张三")).select(t=>new (t.Name,t.Age)).ToList();
如果对于不需要修改的数据可以使用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>),因此可以点出元素的方法和属性