我们有N层应用程序,我们尝试用DDD设计。该应用程序作为REST服务公开。 我们有一个利用状态模式的域实体。州的界面就像这样
interface IDomainObjectState
{
void SetPassed();
void SetFailed();
void SetIncomplete();
void Pause();
void Block();
}
此实体还具有“状态”字段。如果对象的状态允许,则以“Set”开头的状态方法应该更改此字段。
虽然这允许我们在Domain中拥有相当干净的代码,但在服务层却很痛苦:我们使用单独的REST资源来更改实体的状态(例如,我们PUT /result
来执行此操作)。令我哭泣的问题是我们在DTO中的新状态switch
上选择了这三种方法中的一种(我认为唯一的方法是在Application层中)。
将三个“Set *”方法合并为一个是不错的主意?如果不是,请建议另一个重构!
答案 0 :(得分:1)
将三个“Set *”方法合并为一个是不错的主意?
如果唯一的动机是简化与HTTP接口的集成,那不是一个好主意。 IMO,一个switch语句并不可怕,因为它是适配器/ ACL代码的一部分,它通常很简单,易于测试,不需要很好的设计。理想情况下,HTTP适配器将调用封装手头行为的应用程序服务。如果你愿意,你可以在特定的HTTP资源/动词组合和应用程序服务方法之间创建一个映射,但这并没有增加太多的整体价值。