sql >> Databáze >  >> NoSQL >> MongoDB

Diskriminátory typu ovladače MongoDB C# s generickou třídou dědící z negenerické základní třídy

Po nějakém experimentování jsem zjistil, že můžete napsat své vlastní diskriminační konvence. Opravdu nechápu proč, ale zdá se, že výchozí konvence diskriminátoru používá vlastnost Name typové třídy místo FullName, což ji činí nepoužitelnou pro obecné třídy.

Nakonec jsem místo toho použil tento kód:

class FooDiscriminatorConvention : IDiscriminatorConvention
{
    public string ElementName
    {
        get { return "_t"; }
    }

    public Type GetActualType(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType)
    {
        if(nominalType!=typeof(MyAbstractClass))
            throw new Exception("Cannot use FooDiscriminator for type " + nominalType);

        var ret = nominalType;

        var bookmark = bsonReader.GetBookmark();
        bsonReader.ReadStartDocument();
        if (bsonReader.FindElement(ElementName))
        {
            var value = bsonReader.ReadString();

            ret = Type.GetType(value);

            if(ret==null)
                throw new Exception("Could not find type " + value);

            if(!ret.IsSubclassOf(typeof(MyAbstractClass)))
                throw new Exception("Database type does not inherit from MyAbstractClass.");
        }

        bsonReader.ReturnToBookmark(bookmark);

        return ret;
    }

    public BsonValue GetDiscriminator(Type nominalType, Type actualType)
    {
        if (nominalType != typeof(MyAbstractClass))
            throw new Exception("Cannot use FooDiscriminator for type " + nominalType);

        return actualType.FullName;
    }
}

A registrovat jej pomocí

BsonSerializer.RegisterDiscriminatorConvention(typeof(MyGenericClass<>), new FooDiscriminatorConvention()); //is this needed?
BsonSerializer.RegisterDiscriminatorConvention(typeof(MyAbstractClass), new FooDiscriminatorConvention());

Také jsem musel udělat základní třídu neabstraktní, abych se vyhnul chybě „nelze vytvořit instance abstraktních tříd“. Bylo by hezké mít abstraktní základní třídu, ale protože odvozená třída je generická, nemohu použít BsonKnownTypes.



  1. Vazba dynamické odpovědi serveru (vnořený soubor json)

  2. React.js:Nezpracovaný řetězec HTML není rozpoznán jako prvky HTML z Node.js

  3. Sada výsledků MongoDB pro Aggregate()

  4. MongoDB vs. DynamoDB:Co potřebujete vědět