4

データ層とこの層を利用するクライアントコードの間に依存関係を導入することを避けようとしていますが、Mongoでこれを行おうとすると(MongoRepositoryを使用して)いくつかの問題が発生します

MongoRepositoryは、データ構造を反映するタイプを作成し、必要に応じてエンティティを継承する例を示しています。例えば。

[CollectionName("track")]
public class Track : Entity  
{
    public string name { get; set; }
    public string hash { get; set; }

    public Artist artist { get; set; }
    public List<Publish> published {get; set;}
    public List<Occurence> occurence  {get; set;}
}

これらをクライアントコードで利用するために、Mongo固有のタイプをインターフェイスに置き換えたいと思います。例:

[CollectionName("track")]
public class Track : Entity, ITrackEntity 
{
    public string name { get; set; }
    public string hash { get; set; }

    public IArtistEntity artist { get; set; }
    public List<IPublishEntity> published {get; set;}
    public List<IOccurenceEntity> occurence  {get; set;}
}

ただし、Mongoドライバーはこれらのインターフェイスの処理方法を知らないため、当然のことながら次のエラーが発生します。

クラスsf.data.mongodb.entities.Trackのartistプロパティの逆シリアル化中にエラーが発生しました:タイプsf.data.IArtistEntityのシリアライザーが見つかりません。---> MongoDB.Bson.BsonSerializationException:タイプsf.data.IArtistEntityのシリアライザーが見つかりません。

誰かが私がこれにどのように取り組むべきかについて何か提案がありますか?

4

2 に答える 2

1

さて、私は自分の質問に対する答えを見つけました。そして、誰かが同様の問題を抱えている場合に備えて共有したいと思いました。

私が探していた機能はBsonClassMap.RegisterClassMapでした

これにより、ドメインクラスのどのプロパティ/フィールドをシリアル化/逆シリアル化するかを明示的に定義できます(自動マッピングに置き換わることに注意してください。含めるすべてのフィールド/プロパティを定義する必要があります)。これにより、インターフェイスタイプのプロパティへの逆シリアル化の問題が解決され、それ以上の問題は発生しませんでした。

BsonClassMap.RegisterClassMap<Track>(cm =>
{
    cm.MapProperty<IArtistEntity>(c => (IArtistEntity)c.Artist);
    cm.MapProperty<List<IOccurenceEntity>>(c => (List<IOccurenceEntity>)c.Occurence);
    cm.MapProperty(c => c.hash);
    cm.MapProperty(c => c.name);
    cm.MapProperty(c => c.published);

});
于 2012-10-31T22:58:30.660 に答える
1

私がしたことは非常に単純でした、そしてそれはあなたを助けると思います。前の回答のコメント投稿者の何人かと同じ質問があったので、自分でもう少しテストを行いました。これは私のために働いています。

インターフェイスに使用している具象タイプがある場合は、インターフェースタイプの具象タイプ用に生成されたシリアライザを手動で登録できます。

だからあなたの場合。

    BsonSerializer.RegisterSerializer(
        typeof(IPublishEntity), 
        BsonSerializer.LookupSerializer<Publish>());

    BsonSerializer.RegisterSerializer(
        typeof(IOccurenceEntity), 
        BsonSerializer.LookupSerializer<Occurence>());

シリアライザーを登録する直前に、具象型のクラスマップも手動で登録していることにも言及することが重要だと思います。私はそうせずにこの方法をテストしました。まだこれを行っていない場合にLookupSerializerメソッドが失敗するかどうかはわかりませんが、次のようになります。

    BsonClassMap.RegisterClassMap<Publish>(cm => {
        cm.AutoMap();
    });

    BsonClassMap.RegisterClassMap<Occurence>(cm => {
        cm.AutoMap();
    });

言及する価値があるかもしれない単なる注意の補足として、私はこの解決策を他のどこにも見たことがありません。理由は完全にはわかりませんが、一見明らかなものがGoogleのレーダーのどこにも表示されない場合、私は通常少し懐疑的です。これが誰かを助けることを願っています。

于 2015-11-13T06:34:45.207 に答える