При использовании доменного дизайна я часто сталкиваюсь с проблемой, касающейся различных аспектов доменного объекта, особенно при использовании NHibernate. Перспективы - это, по сути, способы просмотра объекта домена. Например, упрощенная модель:
class Transaction
{
string Id { get; set; }
string CustomerName { get; set; }
DateTime Date { get; set; }
decimal Amount { get; set; }
decimal Tax { get; set; }
}
class Batch
{
string Account { get; set; }
string Number { get; set; }
DateTime? ClearDate { get; set; }
IList<Transaction> Transactions { get; }
decimal Total { get; }
}
Общее свойство в пакете - это сумма сумм по каждой транзакции. При рассмотрении одной партии эта модель хорошо работает и является правильным представлением домена. Однако клиентское приложение имеет экран, на котором отображаются коллекции пакетов. Этот экран не требует каких-либо подробностей о транзакциях в пакете, только общая сумма. Использование одного и того же объекта на экране списка медленно. Один из вариантов - сделать свойство Total настраиваемым, другой - создать новый класс, например:
class BatchOverview
{
string Number { get; set; }
decimal Total { get; set; }
}
Это будет иметь свой собственный репозиторий и свое собственное отображение NHibernate на представление базы данных.
- Относится ли этот объект к модели предметной области или он более специфичен для конкретного приложения / графического интерфейса?
- Должен ли объект обзора партии ссылаться на объект партии?
- Это обычная модель?
- Есть ли какие-либо рекомендации по этому вопросу?
DDD имеет концепцию ограниченного контекста, однако в этом случае контекст тот же. И класс Batch, и класс BatchOverview ссылаются на один и тот же «фактический» пакет - это разные виды или перспективы на него.