Хранить все даты как BsonDocuments

1

У меня такое чувство, что это возможно, но я не могу найти его. Я хотел бы настроить мой драйвер mongo, чтобы сделать любой объект DateTime сохраненным как BsonDocument.

Драйвер mongo С# позволяет вам устанавливать определенные соглашения по всему миру, поэтому вам не нужно комментировать все, возможно ли это также и для параметров даты?

Например, я хотел бы удалить следующую аннотацию:

[BsonDateTimeOptions(Representation = BsonType.Document)]

Из всех моих свойств DateTime. Может кто-то указать мне верное направление?

Теги:
datetime

2 ответа

0
Лучший ответ

Долгосрочно, но ответ заключается в использовании пакета конвенции и набора

ConventionRegistry.Register(
            "Dates as utc documents",
            new ConventionPack
            {
                new MemberSerializationOptionsConvention(typeof(DateTime), new DateTimeSerializationOptions(DateTimeKind.Utc, BsonType.Document)),
            },
            t => true);
2

Когда я попытался проверить, что ответ, полученный с помощью devshorts, я получил ошибку времени компиляции (так как метод AddPackPack, который вызывается синтаксисом инициализатора коллекции, ожидает IConvention).

Предлагаемое решение было почти правильным, и потребовалось лишь небольшое изменение:

ConventionRegistry.Register(
    "dates as documents",
    new ConventionPack
    {
        new DelegateMemberMapConvention("dates as documents", memberMap =>
        {
            if (memberMap .MemberType == typeof(DateTime))
            {
                memberMap .SetSerializationOptions(new DateTimeSerializationOptions(DateTimeKind.Utc, BsonType.Document));
            }
        }),
    },
    t => true);

Если нам нужно было использовать это соглашение в более чем одном месте, мы могли бы упаковать его в классе, как это:

public class DateTimeSerializationOptionsConvention : ConventionBase, IMemberMapConvention
{
    private readonly DateTimeKind _kind;
    private readonly BsonType _representation;

    public DateTimeSerializationOptionsConvention(DateTimeKind kind, BsonType representation)
    {
        _kind = kind;
        _representation = representation;
    }

    public void Apply(BsonMemberMap memberMap)
    {
        if (memberMap.MemberType == typeof(DateTime))
        {
            memberMap.SetSerializationOptions(new DateTimeSerializationOptions(_kind, _representation));
        }
    }
}

И затем используйте его так:

ConventionRegistry.Register(
    "dates as documents",
    new ConventionPack
    {
        new DateTimeSerializationOptionsConvention(DateTimeKind.Utc, BsonType.Document)
    },
    t => true);
  • 0
    Хорошо, я также обновил свой ответ, чтобы исправить опечатку, которую я имел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню