Gus*_*dim 11 c# mongodb mongodb-.net-driver
我正在开发一个使用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; }
}
Run Code Online (Sandbox Code Playgroud)
好吧,当我调用该MongoCollection<User>.Insert()方法时,它会抛出两个异常:
System.IO.FileFormatException:反序列化类的.perser的Partner属性时发生错误:反序列化类的Phone属性时发生错误.Partner:值类.Mobile无法反序列化.---> System.IO.FileFormatException:值类.Phone无法反序列化:反序列化类.Partner的移动属性时发生错误.---> MongoDB.Bson.BsonSerializationException:值类.Phone无法反序列化.
然后,我在互联网上搜索了如何将类型反序列化为接口,我想我必须要做的方法:使用BsonClassMap.RegisterClassMap强制转换来映射属性,使用或编写自定义BSON序列化器.
我需要知道这两种方法中的哪一种更好以及如何实现它.
注意:我需要一个不修改接口的解决方案,因为他们的项目不能包含任何外部引用.
Gus*_*dim 13
好吧,我在试图得到这个答案时发现了很多问题.
首先,MongoDB的C#驱动程序,确实有一些问题,反序列化接口时,像克雷格·威尔逊在这个问题上的意见说,和中描述的问题页面.
像我之前所说的,这个问题的安全实现可能是一个自定义的BSON序列化器或特定的类映射,使用BsonClassMap.RegisterClassMap.
所以,我已经实现了类映射并且问题仍然存在.
期待这个问题,我发现异常与驱动程序的另一个问题有关:反序列化时的问题structs.
我已将项目回滚到初始状态(没有类映射或自定义序列化器)并将结构类型更改为类类型,并且它有效.
在恢复中,此异常错误与结构反序列化有关,而与反序列反序列化无关.
无论如何,这是一个真正的问题,第二个问题需要被视为一个错误而不是改进,就像第一个问题一样.
您可以在以下链接中找到问题:
[BsonSerializer(typeof(ImpliedImplementationInterfaceSerializer<IReviewExpert, ReviewExpert>))]
public IReviewExpert Expert { get; set; }
为我工作