Класс TimeSheetActivity имеет коллекцию Allocations. Распределение - это объект-значение, который также используется другими объектами в домене и выглядит примерно так:
public class Allocation : ValueObject
{
public virtual StaffMember StaffMember { get; private set; }
public virtual TimeSheetActivity Activity { get; private set; }
public virtual DateTime EventDate { get ... }
public virtual TimeQuantity TimeSpent { get ... }
}
Повторяющиеся выделения для одного и того же Allocation.EventDate недопустимы. Поэтому, когда клиент пытается выполнить выделение для действия, выполняется проверка, чтобы определить, имеется ли уже выделение в коллекции для того же Allocation.EventDate. Если нет, то новое Распределение добавляется в коллекцию, но если это так, существующее Распределение заменяется новым.
В настоящее время я использую словарь для поддержки коллекции с ключом Allocation.EventDate. Он отлично работает для домена, но мне интересно, если сам факт, что ключ уже является частью значения, сам по себе не является «неприятным запахом».
У меня также нет причин сохранять что-либо, кроме словарных значений. Поскольку я использую NHibernate, мне может понадобиться написать какой-нибудь пользовательский тип, и мне интересно, не является ли это также подсказкой, что мне следует использовать другой тип коллекции. (Это также причина виртуальных свойств в классе Allocation).
Первичной альтернативой, о которой я думаю, был бы HashSet с выделенным EqualityComparer.
Что вы думаете?
Cheers,
Berryl