Сериализация C # в MongoDb - _id для вложенного типа и некоторые свойства с частными установщиками - PullRequest
0 голосов
/ 28 января 2019

Я нахожусь в состоянии, когда мне нужно сериализовать некоторые сложные документы в MongoDb, но я не могу изменить определение класса, поскольку у меня нет контроля над источником.

Однако нам нужночтобы гарантировать, что вызывающие абоненты все еще могут использовать Linq, поэтому нам нужно отобразить класс correclty в MongoDb.

В настоящее время существует несколько проблем, с которыми мы сталкиваемся:

  1. _id _ представление находится во вложенном классе.
  2. Существуют свойства с частными установщиками, которые необходимо сериализовать / десериализовать.

Форма класса выглядитпримерно так:

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 тоже.

1 Ответ

0 голосов
/ 29 января 2019

Я немного подумал об этом, единственный способ увидеть эту работу - это создать подходящие типы, которые будут служить вашим POCO для вставки в mongodb.Я собираюсь предположить, что вы используете драйвер C # для Mongo.

public class AggregateTypeDocument : AggregateBaseDocument
{
   public int IntProperty { get; private set; }
   public ComplexObject ComplexObjectProperty { get; private set; }
}

abstract public class AggregateBaseDocument
{
   public AggregateDetailsDocument Details { get; private set; }
}

 public class AggregateDetailsDocument 
 {
    [BsonId]
    public Guid Id { get; private set; }
    ...other properties
 }

В конечном итоге вы скопируете структуру, но просто добавите Document в конце этого примера.Ни в коем случае вы не должны соответствовать этому

Теперь вы можете формировать свои типы, чтобы быть более дружественными к монго, используя различные атрибуты.

Следующим шагом будет либо в вашем хранилище (или где-либо еще) отобразить типы с определениями классов, к которым у вас нет доступа к вашим новым дружественным монго.

Я бы предложил AutoMapper для этого или простого старого экземпляра.Теперь вы должны быть в состоянии безопасно работать с коллекцией.Ниже приведен пример для автопроизводителя.

  var normalAggregateType = new AggregateType(); 

  var client = new MongoClient("yourconnectionstring");
  var db = client.GetDatabase("mydatabase");

  var collection = db.GetCollection<AggregateTypeDocument>("myaggregatetypes");

  var mongoAggregateType = Mapper.Map<AggregateTypeDocument>(normalAggregateType);

  collection.InsertOne(mongoAggregateType);
...