最近我开始阅读Evans的领域驱动设计书籍,并开始了一个小样本项目,以获取一些DDD的经验。同时,我想学习更多关于MongoDB的知识,并开始用MongoDB和最新的官方C#驱动程序替换我的SQL EF4存储库。 现在,这个问题是关于MongoDB映射的。我发现很容易映射具有公共getter和setter的简单对象——没有难度。但是,如果一个领域实体没有公共setter,则我很难进行映射。据我所学,构造有效实体的唯一真正干净的方法是将所需参数传递给构造函数。请考虑以下示例:
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
加载,并将它们解析为我的领域对象。我尝试了很多方法,但最终未能找到一个简洁的解决方案。我真的需要为 MongoDB 生产具有公共 getter/setter 的 DTO 并将其映射到我的领域对象吗?也许有人可以给我一些建议。
readonly
关键字后,该字段等效于具有自动实现属性(auto-property)的public ObjectId Id { get; private set; }
,此时可以将该字段完全移除。 - Zaid Masudreadonly
关键字...一旦我把它移除,它就可以工作了。这很遗憾...我不想创建DTO
类来对Mongo进行序列化/反序列化...尽管我不喜欢移除readonly
,但我认为这比创建多个DTO类更值得。 - JobaDiniz