C# 从我的服务层访问数据库是件坏事吗?
我的上一个应用程序实现了UoW、DI、IoC、存储库模式、工厂,以及各种看起来很整洁的东西,但维护和调试都很痛苦 我对我最近的应用采取了相反的方法——没有DI,没有IoC,没有UoW,只有MVC,服务层和DB。我可能认为存储库模式完全错了,但我所做的阅读表明,它只负责数据库访问,而不负责业务逻辑,以将这两个关注点分开 在实现存储库模式时,我觉得我只是在复制我的服务层的很多内容。例如,在我的UserService类中,我有以下内容:C# 从我的服务层访问数据库是件坏事吗?,c#,asp.net,repository-pattern,C#,Asp.net,Repository Pattern,我的上一个应用程序实现了UoW、DI、IoC、存储库模式、工厂,以及各种看起来很整洁的东西,但维护和调试都很痛苦 我对我最近的应用采取了相反的方法——没有DI,没有IoC,没有UoW,只有MVC,服务层和DB。我可能认为存储库模式完全错了,但我所做的阅读表明,它只负责数据库访问,而不负责业务逻辑,以将这两个关注点分开 在实现存储库模式时,我觉得我只是在复制我的服务层的很多内容。例如,在我的UserService类中,我有以下内容: public void UpdateAboutMe(Ab
public void UpdateAboutMe(AboutMeDto request)
{
using (var db = CreateContext())
{
var user = db.Users.FirstOrDefault(s => s.Username.Equals(request.Username, StringComparison.OrdinalIgnoreCase));
if (user != null)
{
user.AboutMe = request.AboutMe;
SaveChanges(db);
}
else
{
throw new InvalidDataException("Null User");
}
}
}
通过这种方式,服务获取对象,更新单个字段,将更改提交到数据库,并处理上下文
在我的UserService中,我还有其他类似的方法:
public void UpdateAboutMe(AboutMeDto request)
{
return _userRepository.UpdateAboutMe(request);
}
- GetUserByUserName
- GetUserById
- GetUsersWithChildEntities
- GetUsersWithoutChildEntities(比前者快,对吧?)
- UpdateUser缩略图
- 更新塞尔维亚
- 更新用户兴趣
public void UpdateAboutMe(AboutMeDto request)
{
return _userRepository.UpdateAboutMe(request);
}
这看起来更干净,但不是更干净,因为我只是在移动东西-如果我决定更改我的一个Get方法以包含一些子实体,我现在必须在Repo中创建另一个方法,更新接口,并更新服务方法,而不是直接从我的服务方法执行
基于我上面演示的有限理解,我基本上对学习是否应该实现存储库模式感兴趣。看起来要么给你的应用增加一个垂直的复杂层,要么让你的服务层更强大一点
IMO—使用EF延迟加载和按字段更新—存储库模式的开销似乎要大得多
在这种情况下,我对TDD不感兴趣,所以如果可能的话,我想把可测试性排除在等式之外 如果您对TDD、IoC/DI或可重用性不感兴趣,那么就不需要有多余的层。每一层都有一个目的,但如果你没有这个目的,你就不需要那个层
然而,一旦人们在服务器停机期间开始死亡,重写内容就会变得更加困难。存在解决问题的模式。如果模式解决问题的方式引入了其他在您的环境中不可接受的方式,那么要么您做错了,要么您需要走另一条路 此外,仅仅因为某些东西是一种模式并不意味着你应该盲目地使用它。有很多“模式”,我认为是纯粹的垃圾,因为引入了大量的代码相对较少的收益。 我不知道为什么要使用方法调用来更新单个记录上的单个字段。这似乎让事情变得有点困难,而且肯定会导致大量的DB查询在只有一个查询的情况下被触发,这从本质上说会破坏性能而没有任何好处 两个例子:
GetUser(String userName, Int32 id, Boolean withEntities);
或
第一种方法结合了获取特定用户帐户的常用方法。第二个复制代码,但将其拆分。稍后,您可能会决定在某个时候添加一个GetUser(字符串email,Boolean with entities)
我将把您拥有的各种
UpdateUser…
方法合并为一种。将一个完整的用户对象传递给它,并让一个方法更新整个对象。在很少的情况下,我会让方法只更新一个字段。谢谢你的回答。我有一些问题:“当只有一个数据库查询时,很多数据库查询会被触发。”-我的客户端应用程序向一个只包含ID和AboutMe的API控制器发送请求(以保持负载最小)-API控制器调用相应的服务方法,这样我就不会重新分配不需要重新分配的字段。我不认为这会产生不必要的db调用-字段限制是故意的。想法?所以,有人在他们自己的用户编辑页面上。他们决定改变姓名、出生日期和对我的看法。发生了什么。。是否进行了3次DB呼叫?如果是这样,那么API是错误的。这个网站就是一个很好的例子,去编辑你的个人资料吧。您将看到7个可能需要更改的字段。我保证当有人点击save时不会发出7dB的调用。这不是一个表单-假设他们一次只更新一个字段-没有“同时保存所有字段”。正常用法是什么?他们是否正在进行切换和更改?也许我不理解布局,因为我看不出这是一件好事。通常的用法是在线、AJAX、每字段更新。这是进入用户体验:p