Недавно я начал читать книгу Эванса по дизайну, ориентированному на домен, и начал небольшой примерный проект, чтобы получить некоторый опыт работы с DDD. Теперь этот вопрос касается отображения 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 с общедоступными получателями / сеттерами для MongoDB и сопоставлять их с объектами моего домена? Может, кто-нибудь даст мне совет по этому поводу.