MongoDB C# Driver - Регистрация BsonClassMap для производных классов - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь зарегистрировать карту классов BSON для производного типа BaseClass в другой сборке в C#. Сборка базового класса не имеет ссылки на драйверы MongoDB C# (и я бы хотел оставить это таким образом.)

Мой базовый класс выглядит следующим образом:

public abstract class BaseClass
{
    public string Uno { get; set; }
    public int Dos { get; set; }
    public double Tres { get; set; }
}

* Сборка 1007 * ссылается на драйверы MongoDB C#, но не упоминается в сборке BaseClass. Скорее, сборка загружается во время выполнения с использованием MEF. FooClass имеет следующий код:

public class FooClass : BaseClass
{
    public FooClass()
    {
        mapMongoDbProperties();
    }

    private static void mapMongoDbMembers()
    {
        BsonClassMap.RegisterClassMap<FooClass>(cm => 
        {
            cm.MapMember(x => x.Uno);
            cm.MapMember(x => x.Dos);
            // I do not want to map member Tres.
        }
    }

    // Additional derived functionality goes here.
}

Когда я запускаю эту программу, я всегда получаю следующее исключение:

The memberInfo argument must be for class FooClass, but was for class BaseClass. Parameter name: memberInfo

Что у меня замечено во время отладки:

  • Свойство BaseClassMap объекта BsonClassMap имеет значение null (хотя FooClass явно является производным от BaseClass)
  • Свойство DeclaredMemberMaps объекта BsonClassMap равно пусто (хотя показано 3 свойства)

Мой текущий обходной путь - просто зарегистрировать BsonClassMap для BaseClass и сопоставить элементы, которые я хочу сохранить в MongoDB, а затем зарегистрировать FooClass единственное действие - установка необходимого дискриминатора, а именно:

public class FooClass : BaseClass
{
    public FooClass()
    {
        mapMongoDbProperties();
    }

    private static void mapMongoDbMembers()
    {
        BsonClassMap.RegisterClassMap<BaseClass>(cm => 
        {
            cm.MapMember(x => x.Uno);
            cm.MapMember(x => x.Dos);
            // I do not want to map member Tres.
        }

        BsonClassMap.RegisterClassMap<FooClass>(cm => 
        {
            cm.AutoMap();
            cm.SetDiscriminatorIsRequired(true);
        }
    }

    // Additional derived functionality goes here.
}

Это кажется мне неправильным, особенно если я собираюсь снова получить BaseClass, и я хочу сопоставить другие члены BaseClass, чем FooClass (то есть, возможно, я хочу сопоставить Tres вместо Uno.)

Документация MongoDB не очень помогла. По-видимому, вам нужно установить KnownTypes во время компиляции, что невозможно для моей текущей структуры классов.

Кто-нибудь может посоветовать, пожалуйста?

Заранее спасибо!

...