从我的服务层访问Db是件坏事吗?

时间:2013-11-07 23:47:42

标签: c# asp.net repository-pattern

我的上一个应用程序实现了UoW,DI,IoC,Repository Pattern,Factories,各种看似整洁的东西,但使维护和调试变得痛苦。

我采用与我最近的应用程序相反的方法 - 没有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中,我有其他类似的方法:

  • GetUserByUserName
  • GetUserById
  • GetUsersWithChildEntities
  • GetUsersWithoutChildEntities(比前者更快,对吗?)
  • UpdateUserThumbnail
  • UpdateUserBio
  • UpdateUserInterests

这些中的每一个都不需要相应的Repo方法吗?

如果我实现了一个存储库方法,上面的服务可能如下所示:

public void UpdateAboutMe(AboutMeDto request)
        {
            return _userRepository.UpdateAboutMe(request);
        }

这似乎更干净,但不是很多更清洁,因为我只是在移动东西 - 如果我决定改变我的一个Get方法以包含一些子实体,我现在必须在Repo中创建另一个方法,更新接口,并更新Service方法,而不是直接从我的服务方法中进行。

基于我上面演示的有限理解,我基本上对学习是否应该实现Repository Pattern感兴趣。它似乎要么为您的应用添加一层复杂的垂直层,要么只是让您的服务层更加强大。

IMO - 使用EF延迟加载和每个字段更新 - 存储库模式似乎有更多的开销。

而且,在这种情况下,我对TDD并不陌生,所以如果可能的话,我希望将可测试性排除在外。

2 个答案:

答案 0 :(得分:2)

存在解决问题的模式。如果模式解决问题的方式会引入您环境中不可接受的其他方式,那么要么您做错了,要么只需要走另一条路。

除此之外,仅仅因为某种形式并不意味着你应该盲目地使用它。由于引入了大量代码以获得相对较少的收益,因此我认为有许多“模式”是纯粹的垃圾。

我不确定为什么你有一个方法调用来更新单个记录上的单个字段。这似乎会让事情变得有点困难,当然只会有人会做很多数据库查询,这实际上会破坏性能而无法获得收益。

两个例子:

GetUser(String userName, Int32 id, Boolean withEntities);

GetUser(String userName, Boolean withEntities);
GetUser(Int32 id, Boolean withEntities);

第一个结合了您获取特定用户帐户的常用方法。第二个重复代码,但将其拆分。稍后您可能决定在某个时候添加GetUser(String email, Boolean withEntities)

我有各种UpdateUser...方法。将完整的User对象传递给它并让一个方法更新整个对象。在极少数情况下我会让方法只更新一个字段。

答案 1 :(得分:0)

如果您对TDD,IoC / DI或可重用性不感兴趣,则无需多余的层。每个图层都有一个目的,但如果你没有这个目的,则不需要该图层。

然而,一旦人们在服务器中断期间开始死亡,重写事物会变得更加困难。