MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB C# गैर-जेनेरिक बेस क्लास से विरासत में मिली जेनेरिक क्लास के साथ ड्राइवर टाइप डिस्क्रिमिनेटर

कुछ प्रयोग करने के बाद, मुझे पता चला कि आप अपने स्वयं के विवेचक सम्मेलनों को लिख सकते हैं। मैं वास्तव में क्यों नहीं समझ सकता, लेकिन डिफ़ॉल्ट भेदभावकर्ता सम्मेलन पूर्णनाम के बजाय प्रकार वर्ग की नाम संपत्ति का उपयोग करता प्रतीत होता है, जो इसे सामान्य वर्गों के लिए बेकार बनाता है।

मैंने इसके बजाय इस कोड का उपयोग करना समाप्त कर दिया:

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;
    }
}

और इसे

. के साथ पंजीकृत करना
BsonSerializer.RegisterDiscriminatorConvention(typeof(MyGenericClass<>), new FooDiscriminatorConvention()); //is this needed?
BsonSerializer.RegisterDiscriminatorConvention(typeof(MyAbstractClass), new FooDiscriminatorConvention());

"अमूर्त वर्गों के उदाहरणों को क्रेट नहीं कर सकता" त्रुटि से बचने के लिए मुझे बेस क्लास को गैर-सार बनाना पड़ा। एक सार आधार वर्ग प्राप्त करने में सक्षम होना अच्छा होगा, लेकिन चूंकि व्युत्पन्न वर्ग सामान्य है, इसलिए मैं BsonKnownTypes का उपयोग नहीं कर सकता।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडब:जेसन क्वेरी में ऑब्जेक्ट आईडी से टाइमस्टैम्प निकालें

  2. नोड, नेवला:हटाएं के साथ क्वेरी परिणाम से json तत्व निकालें

  3. समूह और प्रदर्शन डेटा

  4. Node.js . में प्रतीक्षा कैसे करें

  5. किसी ऑब्जेक्ट के अंदर किसी सरणी में नए आइटम को कैसे पुश करें