2010-09-15 2 views
2

В контексте установок DDD на модели домена есть запах кода. Их следует избегать по той простой причине, что они не являются частью домена. В нем нет существительных, которые эксперт домена может понять, а изменения в данных должны проходить через определенные методы.Сеттеры в доменной модели

Пример:

customer.StreetName = ... 
customer.City = ... 

В то время как правильный способ сделать это будет иметь customer.ChangeAddress метод, который мог бы затем опубликовать событие и т.д. и т.п .. По крайней мере, от моего понимания это все теории звука, и я могу полностью понять, почему сеттеры в модели домена не очень желательны.

НО: Без сеттеров на вашей модели домена эти методы довольно сложно проверить.

Как получить экземпляр клиента для выполнения моих тестов, если я не могу его построить, не имея ни конструктора большой задницы, который принимает ВСЕ аргументы, либо делает магию отражения? Я использую NHibernate в бэкэнд, поэтому NHibernate уже делает некоторую магию отражения, чтобы заполнить эти поля в первую очередь.

Но это очень плохо, если у вас есть ctor с 10 аргументами. (И то же самое можно сказать и о заводском методе).

Любые советы по этому вопросу?

привет Daniel

ответ

3

В классическом (не CQRS) DDD это хорошая практика, чтобы разделить все данные на объекты Value, чтобы ваши объекты были сведены к их основной функции: поддержание идентичности.

В вас пример Клиент должен ссылаться на адрес ValueObject и есть метод ChengeAddress, который бы должен быть столь же просто, как:

public void ChangeAddress(Address address) 
{ 
    //Consistency rules are here 
    _address = address; 
} 

Попробуйте двигаться как много логики, как вы можете от ваших лиц в объекты стоимостью. Они по своей сути более проверяемы, поскольку объект с хорошей стоимостью является небольшим и неизменным. Вы используете конструктор для экземпляра VO в заданном состоянии и выполняете его (обычно, вызывая метод, который возвращает другой, преобразованный экземпляр VO).

Последнее, но не менее важное: из моего опыта я могу сказать, что если для тестирования вашей модели домена требуется дополнительная инфраструктура (например, отражение или любой другой инструмент), вы делаете это неправильно (вводя ненужную связь).

+0

Итак, какова альтернатива для объектов с глубоким вложенным значением? Как вы можете их заменить? Я получил ~ 18 листов Excel иерархических данных, где почти все неизменно. –

+0

Хороший вопрос об неизменности :) Почему это отличается в системе CQRS? Из того, что я собираюсь, я мог бы использовать Event Sourcing даже с нормальной моделью домена, просто записывая все команды, которые вызывают в модель домена – Tigraine

1

Вы могли бы хотеть попробовать AutoFixture.

Смешайте в немного отражения любви и области становится довольно проверяемым:

namespace Unit{ 
    using System; 
    using System.Linq.Expressions; 
    public static class ObjectExtensions{ 
    public static T Set<T,TProp>(this T o, 
     Expression<Func<T,TProp>> field,TProp value){ 

     var fn=((MemberExpression)field.Body).Member.Name; 
     o.GetType().GetProperty(fn).SetValue(o,value,null); 
     return o; 
    } 
    } 
} 

Использование:

myUberComplexObject.Set(x=>x.PropertyOfIt, newValueOfIt); 

И Вы должны, по крайней мере, попытаться разделить эти «большие задницы» объекты на более мелкие , Попытайтесь создать иерархию (просто убедитесь, что она совместима с вездесущим языком).

+0

Я стараюсь сделать мои объекты довольно маленькими. И фабричные методы в тестах помогают многое прямо сейчас. Но у клиента все еще должно быть множество информации на нем, например: имя (первый, последний, заголовок ...) адрес (4 поля), день рождения .. и множество других конкретных приложений.Но спасибо, что указали мне на AutoFixture – Tigraine

+0

Извлеките адрес как CustomerAddress. Будет меньше 3 полей. :) –

+0

Если вам нужно передать данные, вам необходимо передать данные – andho

Смежные вопросы