Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从我的服务层访问数据库是件坏事吗?_C#_Asp.net_Repository Pattern - Fatal编程技术网

C# 从我的服务层访问数据库是件坏事吗?

C# 从我的服务层访问数据库是件坏事吗?,c#,asp.net,repository-pattern,C#,Asp.net,Repository Pattern,我的上一个应用程序实现了UoW、DI、IoC、存储库模式、工厂,以及各种看起来很整洁的东西,但维护和调试都很痛苦 我对我最近的应用采取了相反的方法——没有DI,没有IoC,没有UoW,只有MVC,服务层和DB。我可能认为存储库模式完全错了,但我所做的阅读表明,它只负责数据库访问,而不负责业务逻辑,以将这两个关注点分开 在实现存储库模式时,我觉得我只是在复制我的服务层的很多内容。例如,在我的UserService类中,我有以下内容: public void UpdateAboutMe(Ab

我的上一个应用程序实现了UoW、DI、IoC、存储库模式、工厂,以及各种看起来很整洁的东西,但维护和调试都很痛苦

我对我最近的应用采取了相反的方法——没有DI,没有IoC,没有UoW,只有MVC,服务层和DB。我可能认为存储库模式完全错了,但我所做的阅读表明,它只负责数据库访问,而不负责业务逻辑,以将这两个关注点分开

在实现存储库模式时,我觉得我只是在复制我的服务层的很多内容。例如,在我的UserService类中,我有以下内容:

    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