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があるかどうかがチェックされます。そうでない場合は、新しい割り当てがコレクションに追加されますが、追加されている場合は、既存の割り当てが新しい割り当てに置き換えられます。
私は現在、Allocation.EventDateをキーとして、コレクションを維持するためにディクショナリを使用しています。ドメインでは問題なく動作しますが、キーがすでに値の一部になっているという事実自体が「悪臭」ではないかと思います。
また、辞書の値以外のものを永続化する理由はありません。私はNHibernateを使用しているので、それを行うためにカスタムタイプを作成する必要があるかもしれません。それが、別のタイプのコレクションを使用する必要があるという手がかりにもなるのではないかと思います。(これが、Allocationクラスの仮想プロパティの理由でもあります)。
私が考えている主な代替案は、専用のEqualityComparerを備えたHashSetです。
どう思いますか?
乾杯、ベリール