C # MongoDB: Как правильно сопоставить объект домена?

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

26
задан shA.t 12 September 2015 в 10:24
поделиться