Недавно я начал читать книгу дизайна Evans под управлением домена и начал небольшой пробный проект, чтобы получить некоторый опыт работы с DDD. В то же время я хотел узнать больше о MongoDB и начал заменять свои репозитории SQL EF4 на MongoDB и последним официальным драйвером С#. Теперь этот вопрос касается отображения MongoDB. Я вижу, что довольно легко сопоставить простые объекты с общедоступными геттерами и сеттерами - там нет боли. Но мне трудно сопоставлять объекты домена без публичных сеттеров. Как я узнал, единственный действительно чистый подход к построению допустимого объекта - передать необходимые параметры в конструктор. Рассмотрим следующий пример:
public class Transport : IEntity<Transport>
{
private readonly TransportID transportID;
private readonly PersonCapacity personCapacity;
public Transport(TransportID transportID,PersonCapacity personCapacity)
{
Validate.NotNull(personCapacity, "personCapacity is required");
Validate.NotNull(transportID, "transportID is required");
this.transportID = transportID;
this.personCapacity = personCapacity;
}
public virtual PersonCapacity PersonCapacity
{
get { return personCapacity; }
}
public virtual TransportID TransportID
{
get { return transportID; }
}
}
public class TransportID:IValueObject<TransportID>
{
private readonly string number;
#region Constr
public TransportID(string number)
{
Validate.NotNull(number);
this.number = number;
}
#endregion
public string IdString
{
get { return number; }
}
}
public class PersonCapacity:IValueObject<PersonCapacity>
{
private readonly int numberOfSeats;
#region Constr
public PersonCapacity(int numberOfSeats)
{
Validate.NotNull(numberOfSeats);
this.numberOfSeats = numberOfSeats;
}
#endregion
public int NumberOfSeats
{
get { return numberOfSeats; }
}
}
Очевидно, что автоматизация здесь не работает. Теперь я могу сопоставить эти три класса вручную с помощью BsonClassMaps
, и они будут сохранены просто отлично. Проблема в том, что когда я хочу загрузить их из БД, я должен загрузить их как BsonDocuments
и проанализировать их в моем доменном объекте. Я пробовал много вещей, но в конечном итоге не смог получить чистое решение. Должен ли я действительно создавать DTO с общедоступными getter/seters для MongoDB и сопоставлять их с моими объектами домена? Может быть, кто-то может дать мне несколько советов по этому поводу.