Здравствуйте, Tissot, Вы писали:
S>>Вот только что в нашем продукте напоролись: встроенная валидация хочет не более 8 символов для зипкода. В Иране — 10. Прощай, инвариант.
T>Не прощай инвариант, а здравствуй domain model. Кроме zip-кода надо проверить еще и страну и в зависимости от страны выбирать ту или иную стратегию валидации.
Вот на этом месте начинают сыпаться все преимущества Domain Model.
Представляем себе код:
public class Customer
{
private ZipCodeValidationStrategy _zipCodeValidationStrategy;
...
public string ZipCode
{
get {return _zipCode;}
set
{
if(_zipCodeValidationStrategy.Validate(value))
{
_zipCode = value;
}
}
}
}
Вот теперь вопрос, как кастомер получает zipCodeValidationStrategy? Сам класс инстанцировать zipCodeValidationStrategy не может потому что от страны, а страна хранится где-то еще.
Это значит маппер должен уметь инжектить переданный ему инстанс стратегии в создаваемую сущность. С другой стороны при ручном создании инстанса надо инжектить такуюже стратегию.
Учитывая что не все мапперы позволяют перехватывать процесс создания объектов получается не очень хорошо.