接收UnitOfWork参数的服务层方法是否应设为static?
关于Service层方法设为static的安全性解答
先看你给出的代码片段:
Controller中的方法
public ActionResult GetItemsFromServiceLayer(someValue) { using (var unitOfWork = new UnitOfWork(ApplicationDbContext)) { var result = Service.GetItems(unitOfWork, someValue); return View("SomeView", result); } }
Service层的方法
public List<ItemViewModel> GetItems(IUnitOfWork unitOfWork, string someValue) { var listOfItems = unitOfWork.ItemRepo.GetSpecificSetOfItems(someValue).ToList(); foreach(var item in listOfItems) { // Do stuff... } return listOfItems; }
针对你担心的问题:把这个Service层的GetItems设为static后,多用户访问会不会出现异常连接错误?
答案是:完全不会有问题,这么做是安全的。原因如下:
- 你的
GetItems方法没有依赖任何类的实例状态,也没有使用任何静态共享资源——所有核心依赖(IUnitOfWork实例)都是通过方法参数传入的。 - 从Controller的代码能看到,每次请求都会创建一个全新的
UnitOfWork实例(new UnitOfWork(...)),这个实例会被限定在当前请求的using块内,用完就释放。多用户访问时,每个请求的UnitOfWork都是完全独立的,它们的数据库连接、数据操作互相隔离,不会产生冲突。 - ReSharper建议改成static,正是因为这个方法是无状态的纯逻辑方法,不需要依赖Service类的实例就能运行,改成static反而更符合这种无状态方法的设计规范。
唯一需要注意的是:如果未来你给这个Service类添加了实例级的字段(比如共享的DbContext、全局缓存等),那这个static方法就不能再访问这些实例字段了,但就目前的代码来看,完全没有这个问题。
内容的提问来源于stack exchange,提问作者Ryan Taite
相关产品推荐
相关产品推荐

