У меня такое чувство, что это возможно, но я не могу найти его. Я хотел бы настроить мой драйвер mongo, чтобы сделать любой объект DateTime
сохраненным как BsonDocument.
Драйвер mongo С# позволяет вам устанавливать определенные соглашения по всему миру, поэтому вам не нужно комментировать все, возможно ли это также и для параметров даты?
Например, я хотел бы удалить следующую аннотацию:
[BsonDateTimeOptions(Representation = BsonType.Document)]
Из всех моих свойств DateTime
. Может кто-то указать мне верное направление?
Долгосрочно, но ответ заключается в использовании пакета конвенции и набора
ConventionRegistry.Register(
"Dates as utc documents",
new ConventionPack
{
new MemberSerializationOptionsConvention(typeof(DateTime), new DateTimeSerializationOptions(DateTimeKind.Utc, BsonType.Document)),
},
t => true);
Когда я попытался проверить, что ответ, полученный с помощью 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);