我在這裏第一次接觸到DDD,大多數情況下,它似乎是好東西,但也有一些東西困擾着我。自我驗證和映射DTO和DDD
目前主要的是對象驗證自己的想法。
以前,我會寫一個類似的服務方法:
public class MyService
{
private IValidator _validator;
private IDomainMapper _domainMapper;
private IThingThatDoesSomething _thingThatDoesSomething;
private IResponseMapper _responseMapper;
public MyService(IValidator validator, IDomainMapper domainMapper, IResponseMapper responseMapper)
{
_validator = validator;
_domainMapper = domainMapper;
_responseMapper = responseMapper;
}
public ResponseDTO DoSomething(RequestDto requestDto)
{
if (_validator.IsValid(requestDto))
{
var domainObject = _domainMapper.Map(requestDto);
var domainResponse = _thingThatDoesSomething.DoSomething(domainObject);
return _responseMapper.Map(domainResponse);
}
else
{
return new ResponseDTO { Valid = false, Errors = /* some error information */ };
}
}
}
然而,誰花更多的時間是我學習DDD你的同事喜歡的驗證和映射功能坐域對象上。所以DTO看起來像:
public class RequestDto
{
public string Something {get; set; }
public DomainObject Map()
{
return new DomainObject { something = this.Something };
}
public bool IsValid()
{
return this.Something == "something valid";
}
}
這種感覺真的不對。首先,這個對象現在有多重責任,其次,從領域驅動的角度來看,這似乎是錯誤的,因爲我不希望一封信到達我的辦公桌,這個辦公桌宣稱自己是有效的或者不知道如何將自己轉換成別的東西。
有人可以解釋爲什麼這是好的DDD?
+1爲您的詳細和有益的答案!你會說有一個自我驗證的域,並且在應用層中有一個命令(DTO)的空值,範圍等的基本驗證是很好的。 (應用程序層由REST服務器使用) – danfromisrael
@dansfromisrael:是的,您驗證傳入的DTO以確保客戶端遵守REST協議。但是,在一個域中,您還可以檢查業務規則,例如「如果客戶的帳戶餘額爲負值,則客戶無法創建新訂單」。兩者都會導致'_Bad Request_'被返回給客戶端。 –