Я пытаюсь зарегистрировать карту классов 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
во время компиляции, что невозможно для моей текущей структуры классов.
Кто-нибудь может посоветовать, пожалуйста?
Заранее спасибо!