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()
2 つの例外がスローされます。
System.IO.FileFormatException: クラス .User の Partner プロパティの逆シリアル化中にエラーが発生しました: クラス .Partner の Phone プロパティの逆シリアル化中にエラーが発生しました: 値クラス .Mobile は逆シリアル化できません。---> System.IO.FileFormatException: クラス .Partner の Mobile プロパティの逆シリアル化中にエラーが発生しました: 値クラス .Phone を逆シリアル化できません。---> MongoDB.Bson.BsonSerializationException: 値クラス .Phone を逆シリアル化できません。
BsonClassMap.RegisterClassMap
次に、インターネットを検索して、型をインターフェイスとして逆シリアル化する方法を見つけました。それを行うには、プロパティをキャストでマッピングする、カスタム BSON シリアライザーを使用する、または記述する必要があると思います。
これら 2 つの方法のどちらが優れているか、およびその実装方法を知る必要があります。
注:プロジェクトには外部参照を含めることができないため、インターフェイスを変更しないソリューションが必要です。