From 46c6907925dfafe4840ccd98ac8afc6a2c68b491 Mon Sep 17 00:00:00 2001 From: Maksym Sadovnychyy Date: Sun, 22 Sep 2024 13:14:00 +0200 Subject: [PATCH] (feature): add custom Guid and List serializers, removed useless idGenerator in constructor --- .../CollectionDataProviderBaseTests.cs | 2 +- .../Mock/MongoIdGeneratorMock.cs | 19 ----------- .../BaseCollectionDataProviderBase.cs | 4 --- .../CollectionDataProviderBase.cs | 3 +- .../MaksIT.MongoDB.Linq.csproj | 2 +- .../Serializers/GuidSerializer.cs | 23 +++++++++++++ .../Serializers/ListGuidSerializer.cs | 33 +++++++++++++++++++ 7 files changed, 59 insertions(+), 27 deletions(-) delete mode 100644 src/MaksIT.MongoDB.Linq.Tests/Mock/MongoIdGeneratorMock.cs create mode 100644 src/MaksIT.MongoDB.Linq/Serializers/GuidSerializer.cs create mode 100644 src/MaksIT.MongoDB.Linq/Serializers/ListGuidSerializer.cs diff --git a/src/MaksIT.MongoDB.Linq.Tests/CollectionDataProviderBaseTests.cs b/src/MaksIT.MongoDB.Linq.Tests/CollectionDataProviderBaseTests.cs index 7e9ad77..8764a20 100644 --- a/src/MaksIT.MongoDB.Linq.Tests/CollectionDataProviderBaseTests.cs +++ b/src/MaksIT.MongoDB.Linq.Tests/CollectionDataProviderBaseTests.cs @@ -22,7 +22,7 @@ namespace MaksIT.MongoDB.Tests { public TestableCollectionDataProvider(ILogger logger) #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - : base(logger, new MongoClientMock(), new MongoIdGeneratorMock(), "TestDatabase", "TestCollection") { + : base(logger, new MongoClientMock(), "TestDatabase", "TestCollection") { #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. _inMemoryCollection = new List(); // Initialize correctly } diff --git a/src/MaksIT.MongoDB.Linq.Tests/Mock/MongoIdGeneratorMock.cs b/src/MaksIT.MongoDB.Linq.Tests/Mock/MongoIdGeneratorMock.cs deleted file mode 100644 index 5cf0f50..0000000 --- a/src/MaksIT.MongoDB.Linq.Tests/Mock/MongoIdGeneratorMock.cs +++ /dev/null @@ -1,19 +0,0 @@ -using MongoDB.Bson.Serialization; - -namespace MaksIT.MongoDB.Linq.Tests.Mock { - internal class MongoIdGeneratorMock : IIdGenerator { - public Guid Generate() { - return Guid.NewGuid(); - } - - #region not implemented - public object GenerateId(object container, object document) { - throw new NotImplementedException(); - } - - public bool IsEmpty(object id) { - throw new NotImplementedException(); - } - #endregion - } -} diff --git a/src/MaksIT.MongoDB.Linq/Abstractions/BaseCollectionDataProviderBase.cs b/src/MaksIT.MongoDB.Linq/Abstractions/BaseCollectionDataProviderBase.cs index 6fda181..61f4ee5 100644 --- a/src/MaksIT.MongoDB.Linq/Abstractions/BaseCollectionDataProviderBase.cs +++ b/src/MaksIT.MongoDB.Linq/Abstractions/BaseCollectionDataProviderBase.cs @@ -10,19 +10,15 @@ namespace MaksIT.MongoDB.Linq.Abstractions { public abstract class BaseCollectionDataProviderBase : DataProviderBase where TDtoDocument : DtoDocumentBase { - protected readonly IIdGenerator IdGenerator; protected readonly IMongoCollection Collection; protected readonly string _errorMessage = "MaksIT.MongoDB.Linq - Data provider error"; protected BaseCollectionDataProviderBase( ILogger logger, IMongoClient client, - IIdGenerator idGenerator, string databaseName, string collectionName ) : base(logger, client, databaseName) { - IdGenerator = idGenerator; - if (!Database.ListCollectionNames().ToList().Contains(collectionName)) Database.CreateCollection(collectionName); diff --git a/src/MaksIT.MongoDB.Linq/Abstractions/CollectionDataProviderBase.cs b/src/MaksIT.MongoDB.Linq/Abstractions/CollectionDataProviderBase.cs index 1af9b5f..9ce47f4 100644 --- a/src/MaksIT.MongoDB.Linq/Abstractions/CollectionDataProviderBase.cs +++ b/src/MaksIT.MongoDB.Linq/Abstractions/CollectionDataProviderBase.cs @@ -17,10 +17,9 @@ namespace MaksIT.MongoDB.Linq.Abstractions { protected CollectionDataProviderBase( ILogger logger, IMongoClient client, - IIdGenerator idGenerator, string databaseName, string collectionName - ) : base(logger, client, idGenerator, databaseName, collectionName) { } + ) : base(logger, client, databaseName, collectionName) { } #region Insert public Result Insert(TDtoDocument obj, IClientSessionHandle? session) => diff --git a/src/MaksIT.MongoDB.Linq/MaksIT.MongoDB.Linq.csproj b/src/MaksIT.MongoDB.Linq/MaksIT.MongoDB.Linq.csproj index decb2fb..e58ec6f 100644 --- a/src/MaksIT.MongoDB.Linq/MaksIT.MongoDB.Linq.csproj +++ b/src/MaksIT.MongoDB.Linq/MaksIT.MongoDB.Linq.csproj @@ -8,7 +8,7 @@ MaksIT.MongoDB.Linq - 1.0.2 + 1.0.3 Maksym Sadovnychyy MAKS-IT MaksIT.MongoDB.Linq diff --git a/src/MaksIT.MongoDB.Linq/Serializers/GuidSerializer.cs b/src/MaksIT.MongoDB.Linq/Serializers/GuidSerializer.cs new file mode 100644 index 0000000..2d3f88d --- /dev/null +++ b/src/MaksIT.MongoDB.Linq/Serializers/GuidSerializer.cs @@ -0,0 +1,23 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Serializers; + + +namespace MaksIT.MaksIT.MongoDB.Linq.Serializers; + +public class GuidSerializer : SerializerBase { + public override Guid Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { + var bsonType = context.Reader.CurrentBsonType; + if (bsonType == BsonType.Binary) { + var binaryData = context.Reader.ReadBinaryData(); + return new Guid(binaryData.Bytes); + } + throw new FormatException($"Cannot deserialize BsonType '{bsonType}' to Guid."); + } + + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Guid value) { + var guidBytes = value.ToByteArray(); + var binaryData = new BsonBinaryData(guidBytes, BsonBinarySubType.UuidStandard); + context.Writer.WriteBinaryData(binaryData); + } +} diff --git a/src/MaksIT.MongoDB.Linq/Serializers/ListGuidSerializer.cs b/src/MaksIT.MongoDB.Linq/Serializers/ListGuidSerializer.cs new file mode 100644 index 0000000..1eee09e --- /dev/null +++ b/src/MaksIT.MongoDB.Linq/Serializers/ListGuidSerializer.cs @@ -0,0 +1,33 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Serializers; + + +namespace MaksIT.MaksIT.MongoDB.Linq.Serializers; + +public class ListGuidSerializer : SerializerBase> { + private readonly GuidSerializer _guidSerializer = new GuidSerializer(); + + public override List Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { + var bsonType = context.Reader.CurrentBsonType; + if (bsonType == BsonType.Array) { + var guidList = new List(); + context.Reader.ReadStartArray(); + while (context.Reader.ReadBsonType() != BsonType.EndOfDocument) { + var guid = _guidSerializer.Deserialize(context, args); + guidList.Add(guid); + } + context.Reader.ReadEndArray(); + return guidList; + } + throw new FormatException($"Cannot deserialize BsonType '{bsonType}' to List."); + } + + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, List value) { + context.Writer.WriteStartArray(); + foreach (var guid in value) { + _guidSerializer.Serialize(context, args, guid); + } + context.Writer.WriteEndArray(); + } +}