我正在开发一个使用MongoDB(带有 C# 驱动程序)和DDD的项目。
我有一个类(聚合),它有一个类型是接口的属性。在另一个类中,我实现了这个接口。此类具有另一个属性,该属性类型是接口,并使用另一个实现的类进行设置。
下面的代码解释得更好:
// 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 的 Phone 属性时出错:值类 .Mobile 无法反序列化。---> System.IO.FileFormatException:反序列化类 .Partner 的 Mobile 属性时出错:无法反序列化值类 .Phone。---> MongoDB.Bson.BsonSerializationException:值类 .Phone 无法反序列化。
然后,我在互联网上搜索以发现如何将类型反序列化为接口,我想我必须有办法做到这一点:使用强制转换映射属性,使用BsonClassMap.RegisterClassMap
或编写自定义 BSON 序列化程序。
我需要知道这两种方式中哪一种更好以及如何实施。
注意:我需要一个不修改接口的解决方案,因为他们的项目不能包含任何外部引用。