Я нахожусь в состоянии, когда мне нужно сериализовать некоторые сложные документы в MongoDb, но я не могу изменить определение класса, поскольку у меня нет контроля над источником.
Однако нам нужночтобы гарантировать, что вызывающие абоненты все еще могут использовать Linq, поэтому нам нужно отобразить класс correclty в MongoDb.
В настоящее время существует несколько проблем, с которыми мы сталкиваемся:
_id
_ представление находится во вложенном классе. - Существуют свойства с частными установщиками, которые необходимо сериализовать / десериализовать.
Форма класса выглядитпримерно так:
public class AggregateType : AggregateBase
{
public int IntProperty { get; private set; }
public ComplexObject ComplexObjectProperty { get; private set; }
}
С AggregateBase
выглядит так:
abstract public class AggregateBase
{
public AggregateDetails Details { get; set; }
}
И наконец:
public class AggregateDetails
{
public Guid Id { get; set; }
...other properties
}
На базовом классе AggregateBase
,есть свойство под названием Details
, которое содержит Id
совокупности, которая является Guid
.Это поле Id
должно быть сопоставлено с полем ObjectId
или _id
в документе MongoDb.
Мне нужно иметь возможность сериализовать документ, заставляя использовать Details.Id
в качестве_id
, и сериализовать частные сеттеры тоже.
Я сделал это с CosmoDb, используя пользовательский JsonContractResolver
без проблем.Но переход к MongoDb оказался немного более сложным.
Стоит отметить, что существует множество AggregateType
классов, все с различной формой.Я хотел бы найти общий способ их сериализации, без необходимости писать много конкретных картографов, если это возможно - так же, как мы делаем с CosmoDb.
Кроме того, нам нужно это решение для работы споставщик запросов Linq для MongoDb тоже.