Service Layer类是否破坏了SRP原则?

Does the Service Layer classes breaks the SRP principle?

好吧,当我观看 SOLID 视频时,我想到了这一点。 单一职责原则表示"a class should have only a single responsibility"。

很好。但与此同时,我在一个以 N 层模型构建的 ASP.NET MVC 5 项目中工作。我们有 UI 层、存储库层、域层和服务层来公开。在服务层上,我们基本上每个 Domain class(UserServiceCompanyService 等)有一个 class。 UserService class 有一个职责是处理 User 操作,但另一方面,它有很多不同的职责,比如身份验证和处理 User/Company关系。这是否违反了 SRP 原则?

当然可以。其实那个class的代码行数一定很大,明显的代码味。

当你谈论单一职责时,你应该考虑改变的理由。为什么我的代码可以更改?在你举的例子中,我可以想到几个原因:我决定改变身份验证系统,我的数据库工作方式,我进行验证的方式......所有这些都是做出不同 classes 的线索结果为 AuthServiceUserValidatorUsersRepository...

当您向我们描述您的 class 做什么时,您使用了 "and" 这个词:“喜欢身份验证并处理 User/Company 关系”。这是您的 class 做得太多的另一个症状。如果你不使用 "and" 就不能描述 class 你可能违反了原则

虽然您坚信这些变化的可能性不会发生,因为系统会一直很好,但最好还是划分代码,因为这样可以更好地组织和测试代码。

只有当你把所有的多重责任实现放在里面,它才违反了 SRP。在 SRP 中,class 只能承担一项责任。管理用户操作是一项职责,但也可以分解为子职责,例如 authorizationcompany relation

每个子职责都可以作为各自分离的 class 来实现。然后您的 UserService 将使用这些子 classes 一起作为 aggregate services。例如:

public class UserService{
    public UserAuthorizationService UserAuthorizationService = new UserAuthorizationService();
    public UserCompanyRelationService UserCompanyRelationService = new 
UserCompanyRelationService();

    public bool IsAuthorized(){
        // use UserAuthorizationService
    }
    public // whatever you do with UserCompanyRelationService 
}