设计 - 如何将请求参数数据映射到域模型

时间:2014-05-24 04:26:22

标签: java c# ruby domain-driven-design

这是一个设计问题,在任何语言中都是同样的问题。

您是否将控制器映射到域模型?

我们的情况一般都大于......考虑示例对象。

情况1 - 我们有一个请求,其中包含该帐户的所有参数; {“id”:“1”,“name”:“test”,“some”:“xxx”} .............等领域。

情况2 - 可以请求必须具有某个帐户参数,例如在更新的情况下; {“id”,“1”,“name”,“testUpdated”}

情况3 - 我们有一个请求,其中包含一些帐户参数,其他人更像是id作为用户在一起; {“id”:“1”,“user”:“xxx”,“service”:“yyy”}在这种情况下,每个请求都会转换一个对象。

public class Account {

private Long id;
private String name ;
private String some ;

}

我看到了几个选项;

1 - 我可以在控制器中获取AccountForm并在CONTROLLER中设置Account对象和其他对象的属性;

+ ok for situation.1 situations 2, and situation.3
+ Separates the requisition of the object domain
- Pollutes the controller with code conversion
- Controller is full of setters .. if a higher class as a large object as a request is very confusing .

controller ( AccountForm from ) {
Account account = new Account ( )
account.setNome form.getNome = ();
account.setSome form.getSome = ();
Other outher = new Other ( ) ;
other.setSome ( form.getSome ( ) ) ;
}

2 - 我是否可以在控制器中获得AccountRequest并将其自身作为AccountRequest.getAccount()来返回映射模型,在这种情况下,映射位于自己的Request对象。

+ Separates the requisition of the object domain
+ Encapsulates the conversion in a place with easy access .
+ Meets situation.1 situation.2 and situation3 ;
- Request object has two responsibilities represent the request and map to a valid model .

controller ( AccountForm accountRequest ) {
Account account = accountRequest.getAccount ( ) ;
Outher outher accountRequest.getOther = ( ) 
}

3 - 我是否可以获得已填充空值的控制器直接帐户。

+ Eliminate object request
- Serves only situation.1 situation.2 .

controller (Account account ) {
account.someMethod ();
}

4 - 将此映射请求参数外包给另一个对象映射器以获取请求..

+ Isolates logic mapping
- Until complexity for simpler cases are used as standard for all such a find by id .
- One more class for each request ;

在API变得更糟的情况下,响应还有两个类。在回应请求方面发言.... AccountRequest,AccountRequestMapper,Account,AccountResponseMapper,AccountResponse ........

我正在针对简单案例(查找ID或更新)对Hybrid选项3进行更多测试....例如,对于更复杂的情况,选项2 ...

什么是理想/什么是表达和易于维护?谢谢。

1 个答案:

答案 0 :(得分:0)

您在问题中列出的每种方式都是技术上的,#34;正确的" :)。您是选择其中一种还是使用不同的方法取决于您的用例的复杂程度。

请仔细阅读DDD bible,了解您是否需要域模型。

现在让我们假设您这样做并且还假设该帐户是一个聚合根,那么您当然不希望将您的域模型暴露给外部词。

您可能会使用DTO等来收集有关帐户模型的足够信息,然后委托给将为您构建帐户AR的工厂/建筑商。

我再次鼓励您仔细阅读本书并确定您是否需要复杂性。