我已经开始了一个小而简单的项目(一个非常原始的博客)来获得DDD的实践经验,而我相信我理解了我还没有能够解决以下问题的基本概念。
鉴于POCO对象'post',我想使用存储库来保存它,使用带有upsert参数的mongodb collection.update方法实现(参见下面的代码)
public Post Save(Post p)
{
var wc = collection.Update(
Query<Post>.EQ<string>(p0 => p0.permalink, p.permalink),
Update<Post>.Replace(p),
UpdateFlags.Upsert);
return p;
}
但是,似乎有必要将特定于mongodb的属性应用于您的Id字段,以便upsert正常工作,详见答案:https://stackoverflow.com/a/20224022/741695
因此,我只能看到两种可能的行动方式:
1)将mongodb程序集的引用添加到我的域库项目中,但感觉不对,因为mongodb是存储库实现细节(因此属于DAL)
2)将“post”实例(poco域对象)传递给PostRepository实现,并通过将域对象映射到DTO来处理与之相关的任何与实现相关的问题
虽然第二个解决方案似乎符合DDD原则,但实施起来比第一个解决方案更昂贵,所以我想知道是否有更好的选择。
提前感谢您的反馈。
答案 0 :(得分:2)
您不必使用该属性来映射ID,您无法使用RegisterClassMap
在DAL中执行此操作:
BsonClassMap.RegisterClassMap<Post>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(p => p.Id));
});
BTW:你可以在不映射Id的情况下进行upsert,你就是不能使用简单的Update<Post>.Replace(p)
。您需要自己创建更新。