【发布时间】:2013-04-22 19:25:43
【问题描述】:
考虑有一个非常复杂的业务需求,需要在启动操作时执行多个业务逻辑步骤。例如,当用户提交请求时,需要执行的步骤是:
- 验证数据
- 验证请求是否已存在
- 验证用户是否存在
- 验证用户是否有足够的财务金额来提交请求
- 验证用户是否可以立即发布请求
- 验证是否有请求的项目
- 验证请求的项目是否有效
- 验证项目没有负金额
- ...(进一步验证)
- 将数据存储到存储库
- 向用户或相关方发送电子邮件
- ...(可能需要完成其他步骤)
上面的例子可能与真正的业务需求相去甚远,但考虑到它是,那么我想这个操作将有大约 10 多个服务。
在使用构造函数依赖时,拥有 10 个以上的构造函数应该是一件坏事,所以我认为重构它就可以完成这项工作。重构设计的一些说明:
ISubmitter(IValidator, IRequestRepository, INotification)
IValidator(IRequestValidator, IItemValidator)
IRequestValidator(IRequestRepository, IUserValidator, IItemExistValidator)
IUserValidator(IUserRepository, IUserFinancialValidator, IUserPublisherValidator)
IItemValidator(IItemRepository, IItemAmountValidator)
... // maybe more
项目金额验证流程从提交者做了4层:ISubmitter->IValidator->IItemValidator->ItemAmountValidator。
我知道就关注点分离而言,我可以轻松获得所需的正确实现(例如:ItemAmountValidation)。但是在调试代码方面,跟踪它使用哪个验证类会不会变得更加困难?既然构造函数注入是在实现中定义的,而不是在接口中定义的?
考虑最坏的场景,当调试者不是开发者时,只有最低限度的测试场景,根本没有文档。
【问题讨论】:
-
@Steven 是的,我也读过这篇文章。但它谈论的是实体如何在层之间传递,我问的是业务逻辑的分层/分区。不错的文章,但必须阅读。
标签: design-patterns architecture dependency-injection