服务层类是否违反了SRP原则?

时间:2015-04-07 01:31:24

标签: design-patterns architecture solid-principles

嗯,当我在观看 SOLID 视频时,我想到了这一点。 单一责任原则表示"一个班级应该只有一个责任"。

这很好。但与此同时,我正在使用N-Layer模型构建的ASP.NET MVC 5项目。我们有UI层,存储库层,域层和要公开的服务层。在服务层,我们基本上每个类(UserServiceCompanyService等)有一个类。 UserService类具有一个负责User操作的责任,但另一方面,它具有许多不同的响应能力,如身份验证和处理该用户/公司关系。这违反了SRP原则吗?

2 个答案:

答案 0 :(得分:7)

仅当您将所有多重责任实施置于内时,才会违反SRP。在SRP中,一个班级只能承担一项责任。管理用户操作是一项责任,但也可以分解为子责任,例如authorizationcompany relation等。

每个子责任都可以作为每个分离的类来实现。然后,您的UserService将这些子类一起用作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 
}

答案 1 :(得分:5)

当然。实际上,该类的代码行数必须非常大,这清楚地表明了代码的味道。

当你谈到单一的责任时,你应该考虑改变的原因。为什么我的代码会改变?在您放置的示例中,我可以想到几个原因:我决定更改auth系统,我的数据库工作方式,我进行验证的方式......所有这些都是使不同的类具有结果的线索{{ 1}},AuthServiceUserValidator ...

当您向我们描述您的课程所做的事情时,您使用了"和":" 这样的身份验证并处理该用户/公司关系" 。这是你班级做得太多的另一个症状。如果你不使用"和"来描述课程。你可能违反了原则

尽管您确信这些变更的可能性不会因为系统总是很好而发生,但它可以很好地划分代码,因为您可以更好地组织和测试代码。