Я разрабатываю проект, который использует MongoDB (с драйвером С#) и 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: ошибка произошло при десериализации свойства Phone класса .Partner: класс ценности .Mobile нельзя десериализовать. --- > System.IO.FileFormatException: при десериализации произошла ошибка свойство Mobile класса .Partner: Value класс. Телефон нельзя десериализовать. --- > MongoDB.Bson.BsonSerializationException: класс значений. Телефон не может быть десериализован.
Затем я искал в Интернете, чтобы узнать, как десериализовать тип как интерфейс, и я думаю, что мне нужно это сделать: сопоставление свойства с литой, используя BsonClassMap.RegisterClassMap
или запись пользовательского сериализатора BSON.
Мне нужно знать, какой из этих двух способов лучше и как его реализовать.
Примечание. Мне нужно решение, которое не изменяет интерфейсы, потому что их проект не может содержать никаких внешних ссылок.