【发布时间】:2013-01-28 12:13:46
【问题描述】:
我正在开发一个使用 MongoDB(带有 C# 驱动程序)和 DDD 的项目。
我有一个类 (aggregate),它有一个类型是接口的属性。在另一个类中,我实现了这个接口。这个类有另一个属性,它的类型是一个接口,并且是用另一个实现的类来设置的。
下面的代码解释得更好:
// Interfaces
public interface IUser {
Guid Id { get; set;}
IPartner Partner{ get; set; }
}
public interface IPartner {
IPhone Mobile { get; set; }
}
public interface IPhone {
string number { get; set; }
}
// Implemented Classes
public class User: IUser {
[BsonId(IdGenerator = typeof(GuidGenerator))]
public Guid Id { get; set; }
[BsonIgnoreIfNull]
public IPartner Partner { get; set; }
}
public struct Partner : IPartner {
public IPhone Mobile { get; set; }
}
public struct Phone : IPhone {
public string Number { get; set; }
}
好吧,当我调用MongoCollection<User>.Insert() 方法时,它会抛出两个异常:
System.IO.FileFormatException:反序列化时出错 .User 类的 Partner 属性:错误 反序列化类的电话属性时发生 .Partner:价值类 .Mobile 无法反序列化。 ---> System.IO.FileFormatException:反序列化时出错 .Partner 类的 Mobile 属性:值 class .Phone 无法反序列化。 ---> MongoDB.Bson.BsonSerializationException:值类 .Phone 无法反序列化。
然后,我在互联网上搜索了如何将类型反序列化为接口,我想我必须有办法做到这一点:使用强制转换映射属性,使用 BsonClassMap.RegisterClassMap 或编写自定义 BSON 序列化程序。
我需要知道这两种方式中哪一种更好以及如何实施。
注意:我需要一个不修改接口的解决方案,因为他们的项目不能包含任何外部引用。
【问题讨论】:
-
我会尝试他们两个,看看哪个更容易。显然,编写自定义序列化程序会很困难。我们正在研究如何更好地反序列化这种类型的结构。
-
再次感谢您,克雷格。在尝试自定义序列化程序之前,我将尝试注册类映射。那么,驱动程序没有这个功能来反序列化到接口吗?如果计划好了,能否给我一个来自 MongoDB Jira 的链接,例如 LinQ 投影?
-
非常感谢。我现在正在投票并关注这个问题。
标签: c# mongodb mongodb-.net-driver