我在C#中开发N-Tier应用程序。服务器端包含以下层:
现在以这种方式处理客户端请求:
尽管Automapper减轻了代码重复,但它仍然很好用。实际问题是:
客户端在不同视图中显示相同的对象:网格,表单等。例如,网格(列表)视图仅需要来自User对象的Id和Name,而Form(详细信息)视图需要每个User的属性。但是Business层对视图一无所知。它只能为Service调用提供完整的UserBL对象,然后将UserBL映射到UserListDto或UserDetailsDto是服务职责。对于一些重型对象,从DB中获取额外的字段会成为性能问题。
那么,Business层是否应该为不同的客户端操作提供不同的方法?我不喜欢这个解决方案,因为它看起来像域逻辑污染,但我不知道还能做些什么。
答案 0 :(得分:2)
客户端在不同视图中显示相同的对象:网格,表单等。例如,网格(列表)视图仅需要来自User对象的Id和Name,而Form(详细信息)视图需要每个User的属性。但是Business层对视图一无所知。它只能为Service调用提供完整的UserBL对象,然后将UserBL映射到UserListDto或UserDetailsDto是服务职责。对于一些重型对象,从DB中获取额外的字段会成为性能问题。
我通常会根据BL中的操作类型返回业务实体的不同表示形式。例如,在搜索返回时,用户的搜索表示只包含 身份 所需的最小属性集。在获取特定用户时,我返回一个完整的业务对象。
关于代码重复的问题。这不是重复。用户的这些不同表示具有不同的职责。
因此,如果您只使用一个用户的表示,您将合并所有这些责任,因此必须在良好的设计中做出牺牲才能够将其用于每个人。唯一真正的好处是你必须写几行代码。当您开始维护已发布的应用程序时,请记住这一点。你节省了几行,但要维护的应用程序要难得多。