From 625fd46165f2823a0f778abd3615df014e421e49 Mon Sep 17 00:00:00 2001 From: Darren Hull Date: Wed, 22 Apr 2020 08:48:25 +0100 Subject: [PATCH 1/5] Allow the migration of individual types within a collection --- .../Mongo.Migration.Test.Core.csproj | 1 + Mongo.Migration.Test/IntegrationTest.cs | 12 +- ...nRunner_when_migrating_a_typed_document.cs | 107 ++++++++++++++++++ .../Mongo.Migration.Test.csproj | 9 ++ .../TestDoubles/WithInheritance/Boat.cs | 8 ++ .../TestDoubles/WithInheritance/Car.cs | 11 ++ .../WithInheritance/CarMigration_0_0_1.cs | 20 ++++ .../TestDoubles/WithInheritance/Vehicle.cs | 10 ++ Mongo.Migration.Test/app.config | 19 ++++ Mongo.Migration.Test/packages.config | 1 + .../Migrations/CollectionMigrationRunner.cs | 15 ++- 11 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 Mongo.Migration.Test/Migrations/CollectionRunner_when_migrating_a_typed_document.cs create mode 100644 Mongo.Migration.Test/TestDoubles/WithInheritance/Boat.cs create mode 100644 Mongo.Migration.Test/TestDoubles/WithInheritance/Car.cs create mode 100644 Mongo.Migration.Test/TestDoubles/WithInheritance/CarMigration_0_0_1.cs create mode 100644 Mongo.Migration.Test/TestDoubles/WithInheritance/Vehicle.cs create mode 100644 Mongo.Migration.Test/app.config diff --git a/Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj b/Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj index 12fe1c4..e454275 100644 --- a/Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj +++ b/Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj @@ -17,6 +17,7 @@ + diff --git a/Mongo.Migration.Test/IntegrationTest.cs b/Mongo.Migration.Test/IntegrationTest.cs index 0fbce67..33f5269 100644 --- a/Mongo.Migration.Test/IntegrationTest.cs +++ b/Mongo.Migration.Test/IntegrationTest.cs @@ -1,4 +1,6 @@ using System; +using LightInject; +using Mongo.Migration.Migrations.Adapters; using Mongo.Migration.Startup; using Mongo.Migration.Startup.Static; using Mongo2Go; @@ -9,8 +11,10 @@ namespace Mongo.Migration.Test { public class IntegrationTest : IDisposable { + protected const string DatabaseName = "PerformanceTest"; + protected const string CollectionName = "Test"; protected IMongoClient _client; - + protected IContainerAdapter _containerAdapter; protected IComponentRegistry _components; protected MongoDbRunner _mongoToGoRunner; @@ -20,9 +24,11 @@ protected void OnSetUp() _mongoToGoRunner = MongoDbRunner.Start(); _client = new MongoClient(_mongoToGoRunner.ConnectionString); - _client.GetDatabase("PerformanceTest").CreateCollection("Test"); + _client.GetDatabase(DatabaseName).CreateCollection(CollectionName); + + _containerAdapter = new LightInjectAdapter(new ServiceContainer()); - _components = new ComponentRegistry( new MongoMigrationSettings() {ConnectionString = _mongoToGoRunner.ConnectionString, Database = "PerformanceTest"}); + _components = new ComponentRegistry( new MongoMigrationSettings() {ConnectionString = _mongoToGoRunner.ConnectionString, Database = DatabaseName }, _containerAdapter); _components.RegisterComponents(_client); } diff --git a/Mongo.Migration.Test/Migrations/CollectionRunner_when_migrating_a_typed_document.cs b/Mongo.Migration.Test/Migrations/CollectionRunner_when_migrating_a_typed_document.cs new file mode 100644 index 0000000..08feb08 --- /dev/null +++ b/Mongo.Migration.Test/Migrations/CollectionRunner_when_migrating_a_typed_document.cs @@ -0,0 +1,107 @@ +using Mongo.Migration.Documents.Attributes; +using Mongo.Migration.Documents.Locators; +using Mongo.Migration.Migrations; +using MongoDB.Bson; +using MongoDB.Driver; +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using FluentAssertions; +using Mongo.Migration.Documents; +using Mongo.Migration.Test.TestDoubles; +using Mongo.Migration.Migrations.Locators; + +namespace Mongo.Migration.Test.Migrations +{ + public class CollectionMigrationRunner_when_migrating_a_typed_document : IntegrationTest + { + private ICollectionMigrationRunner _runner; + private IMongoCollection _collection; + + [SetUp] + public async Task SetUp() + { + + base.OnSetUp(); + + //mock ICollectionLocator for migration Type to execute + var collectionLocatorMock = new Mock(); + collectionLocatorMock.Setup(x => x.GetLocatesOrEmpty()) + .Returns(new Dictionary() + { + {typeof(Car), new CollectionLocationInformation(DatabaseName,CollectionName)} + }); + + var migrationLocatorMock = new Mock(); + migrationLocatorMock.Setup(x => x.GetMigrationsFromTo(It.Is(t => t==typeof(Car)), + It.IsAny(),It.IsAny())) + .Returns(new[] {new CarMigration_0_0_1() }); + + migrationLocatorMock.Setup(x => x.GetLatestVersion(It.Is(t => t == typeof(Car)))) + .Returns(new DocumentVersion(0, 0, 1)); + + _containerAdapter.RegisterInstance(collectionLocatorMock.Object); + _containerAdapter.RegisterInstance(migrationLocatorMock.Object); + + _collection = _client.GetDatabase(DatabaseName).GetCollection(CollectionName); + await SeedDatabaseAsync(); + + _runner = _components.Get(); + + } + + private async Task SeedDatabaseAsync() + { + var vehicleData = new[] + { + GetCar(), + GetBoat() + }; + + await _collection.InsertManyAsync(vehicleData); + } + + + [TearDown] + public void TearDown() + { + this.Dispose(); + } + + [Test] public async Task when_migrating_a_typed_document_then_only_that_type_is_returned_in_the_batch() + { + _runner.RunAll(); + var results = (await _collection.FindAsync(FilterDefinition.Empty)).ToList(); + var migratedResult = results.Where(x => x.Contains("Version")).SingleOrDefault(); + + results.Count().Should().Be(2); + migratedResult.Should().NotBeNull(); + migratedResult.Should().BeEquivalentTo(GetCarWithVersion()); + } + + #region testData + private static BsonDocument GetCar() + { + return new BsonDocument { { "_id", new ObjectId("5e9ff3856c9cab88f0a1cf1f") }, { "_t", new BsonArray() { "Vehicle", "Car" } }, { "Doors", 3 }, { "Type", "Cabrio" }, }; + } + + private static BsonDocument GetCarWithVersion() + { + var car = GetCar(); + car.Add(new BsonElement("Version", "0.0.1")); + return car; + } + + private static BsonDocument GetBoat() + { + return new BsonDocument { { "_id", new ObjectId("5e9ff3856c9cab88f0a1cf2f") }, { "_t", new BsonArray() { "Vehicle", "Boat" } }, { "Propellers", 3 }, { "Type", "Bertram 35" }, }; + } + + + #endregion + + } +} diff --git a/Mongo.Migration.Test/Mongo.Migration.Test.csproj b/Mongo.Migration.Test/Mongo.Migration.Test.csproj index 58bd3b4..f3ff608 100644 --- a/Mongo.Migration.Test/Mongo.Migration.Test.csproj +++ b/Mongo.Migration.Test/Mongo.Migration.Test.csproj @@ -61,6 +61,9 @@ ..\packages\MongoDB.Driver.Core.2.8.0\lib\net452\MongoDB.Driver.Core.dll True + + ..\packages\Moq.4.13.1\lib\net45\Moq.dll + ..\packages\NSubstitute.4.1.0\lib\net46\NSubstitute.dll @@ -98,6 +101,10 @@ + + + + @@ -127,8 +134,10 @@ + + diff --git a/Mongo.Migration.Test/TestDoubles/WithInheritance/Boat.cs b/Mongo.Migration.Test/TestDoubles/WithInheritance/Boat.cs new file mode 100644 index 0000000..c1af5b2 --- /dev/null +++ b/Mongo.Migration.Test/TestDoubles/WithInheritance/Boat.cs @@ -0,0 +1,8 @@ +namespace Mongo.Migration.Test.TestDoubles +{ + internal class Boat : Vehicle + { + public int Propellers { get; set; } + + } +} diff --git a/Mongo.Migration.Test/TestDoubles/WithInheritance/Car.cs b/Mongo.Migration.Test/TestDoubles/WithInheritance/Car.cs new file mode 100644 index 0000000..2a51ab0 --- /dev/null +++ b/Mongo.Migration.Test/TestDoubles/WithInheritance/Car.cs @@ -0,0 +1,11 @@ +using Mongo.Migration.Documents.Attributes; + +namespace Mongo.Migration.Test.TestDoubles +{ + + [StartUpVersion("0.0.1")] + internal class Car : Vehicle + { + public int Doors { get; set; } + } +} diff --git a/Mongo.Migration.Test/TestDoubles/WithInheritance/CarMigration_0_0_1.cs b/Mongo.Migration.Test/TestDoubles/WithInheritance/CarMigration_0_0_1.cs new file mode 100644 index 0000000..d688194 --- /dev/null +++ b/Mongo.Migration.Test/TestDoubles/WithInheritance/CarMigration_0_0_1.cs @@ -0,0 +1,20 @@ +using Mongo.Migration.Migrations; +using MongoDB.Bson; + +namespace Mongo.Migration.Test.TestDoubles +{ + internal class CarMigration_0_0_1 : Migration + { + public CarMigration_0_0_1() : base("0.0.1") + { + } + + public override void Up(BsonDocument document) + { + } + + public override void Down(BsonDocument document) + { + } + } +} diff --git a/Mongo.Migration.Test/TestDoubles/WithInheritance/Vehicle.cs b/Mongo.Migration.Test/TestDoubles/WithInheritance/Vehicle.cs new file mode 100644 index 0000000..4ba16bb --- /dev/null +++ b/Mongo.Migration.Test/TestDoubles/WithInheritance/Vehicle.cs @@ -0,0 +1,10 @@ +using Mongo.Migration.Documents.Attributes; +using Mongo.Migration.Documents; +using MongoDB.Bson; + +namespace Mongo.Migration.Test.TestDoubles +{ + internal class Vehicle : Document + { + } +} diff --git a/Mongo.Migration.Test/app.config b/Mongo.Migration.Test/app.config new file mode 100644 index 0000000..3405d87 --- /dev/null +++ b/Mongo.Migration.Test/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Mongo.Migration.Test/packages.config b/Mongo.Migration.Test/packages.config index c4f2665..8aa3454 100644 --- a/Mongo.Migration.Test/packages.config +++ b/Mongo.Migration.Test/packages.config @@ -7,6 +7,7 @@ + diff --git a/Mongo.Migration/Migrations/CollectionMigrationRunner.cs b/Mongo.Migration/Migrations/CollectionMigrationRunner.cs index 8c817bc..a8cd2d6 100644 --- a/Mongo.Migration/Migrations/CollectionMigrationRunner.cs +++ b/Mongo.Migration/Migrations/CollectionMigrationRunner.cs @@ -126,12 +126,21 @@ private FilterDefinition CreateQueryForRelevantDocuments( { var currentVersion = _versionService.GetCurrentOrLatestMigrationVersion(type); - var existFilter = Builders.Filter.Exists(_versionService.GetVersionFieldName(), false); - var notEqualFilter = Builders.Filter.Ne( + var versionExistFilter = Builders.Filter.Exists(_versionService.GetVersionFieldName(), false); + + var versionNotEqualFilter = Builders.Filter.Ne( _versionService.GetVersionFieldName(), currentVersion); - return Builders.Filter.Or(existFilter, notEqualFilter); + var versionExistsOrDoesntMatchFilter = Builders.Filter.Or(versionExistFilter, versionNotEqualFilter); + + var typeExistFilter = Builders.Filter.Exists("_t", false); + var typeEqualsFilter = Builders.Filter.AnyEq( + "_t", type.Name); + + var typeExistsOrMatchsFilter = Builders.Filter.Or(typeExistFilter, typeEqualsFilter); + + return Builders.Filter.And(versionExistsOrDoesntMatchFilter, typeExistsOrMatchsFilter); } } } \ No newline at end of file From a83f070466361fa3c1ece58d544eb90905480b8a Mon Sep 17 00:00:00 2001 From: Darren Hull Date: Tue, 24 Nov 2020 15:12:45 +0000 Subject: [PATCH 2/5] add IMigration Interceptor Provider Interface --- .../Interceptors/IMigrationInterceptorProvider.cs | 8 ++++++++ .../Services/Interceptors/MigrationInterceptorProvider.cs | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs new file mode 100644 index 0000000..8b6e7f0 --- /dev/null +++ b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs @@ -0,0 +1,8 @@ +using MongoDB.Bson.Serialization; + +namespace Mongo.Migration.Services.Interceptors +{ + public interface IMigrationInterceptorProvider : IBsonSerializationProvider + { + } +} \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs index 2d6759a..51eb416 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs @@ -5,8 +5,8 @@ using MongoDB.Bson.Serialization; namespace Mongo.Migration.Services.Interceptors -{ - internal class MigrationInterceptorProvider : IBsonSerializationProvider + + internal class MigrationInterceptorProvider : IMigrationInterceptorProvider { private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; From fe4ee78753881ea80a733bd9f8dbd572565783c9 Mon Sep 17 00:00:00 2001 From: Darren Hull Date: Tue, 24 Nov 2020 15:28:40 +0000 Subject: [PATCH 3/5] merged runtime branch changes and made interfaces public --- Mongo.Migration.Test/Mongo.Migration.Test.csproj | 7 +++++++ .../MigrationInterceptorProvider_when_get_serializer.cs | 4 ++-- Mongo.Migration.Test/packages.config | 1 + .../Documents/Locators/RuntimeVersionLocator.cs | 2 +- .../Documents/Locators/StartUpVersionLocator.cs | 2 +- Mongo.Migration/Migrations/CollectionMigrationRunner.cs | 2 +- Mongo.Migration/Migrations/ICollectionMigrationRunner.cs | 2 +- Mongo.Migration/Migrations/IMigrationRunner.cs | 2 +- .../Migrations/Locators/TypeMigrationDependencyLocator.cs | 2 +- Mongo.Migration/Migrations/MigrationRunner.cs | 2 +- Mongo.Migration/MongoMigration.cs | 2 +- Mongo.Migration/Services/IMigrationService.cs | 2 +- .../Services/Interceptors/IMigrationInterceptorFactory.cs | 2 +- .../Services/Interceptors/MigrationInterceptorFactory.cs | 2 +- .../Services/Interceptors/MigrationInterceptorProvider.cs | 2 +- Mongo.Migration/Services/MigrationService.cs | 8 ++++---- Mongo.Migration/Services/VersionService.cs | 2 +- .../Startup/DotNetCore/MongoMigrationExtensions.cs | 2 +- Mongo.Migration/Startup/Static/ComponentRegistry.cs | 2 +- 19 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Mongo.Migration.Test/Mongo.Migration.Test.csproj b/Mongo.Migration.Test/Mongo.Migration.Test.csproj index f3ff608..89ede50 100644 --- a/Mongo.Migration.Test/Mongo.Migration.Test.csproj +++ b/Mongo.Migration.Test/Mongo.Migration.Test.csproj @@ -44,6 +44,9 @@ ..\packages\FluentAssertions.5.6.0\lib\net47\FluentAssertions.dll True + + ..\packages\LightInject.6.4.0\lib\net46\LightInject.dll + ..\packages\Mongo2Go.2.2.11\lib\netstandard1.6\Mongo2Go.dll @@ -79,6 +82,9 @@ True + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll True @@ -87,6 +93,7 @@ ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll True + ..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll True diff --git a/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index 0910871..f977068 100644 --- a/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -25,7 +25,7 @@ public void TearDown() public void When_entity_is_document_Then_provide_serializer() { // Arrange - var provider = _components.Get(); + var provider = _components.Get(); // Act var serializer = provider.GetSerializer(typeof(TestDocumentWithOneMigration)); @@ -38,7 +38,7 @@ public void When_entity_is_document_Then_provide_serializer() public void When_entity_is_not_document_Then_provide_null() { // Arrange - var provider = _components.Get(); + var provider = _components.Get(); // Act var serializer = provider.GetSerializer(typeof(TestClass)); diff --git a/Mongo.Migration.Test/packages.config b/Mongo.Migration.Test/packages.config index 8aa3454..e1e9047 100644 --- a/Mongo.Migration.Test/packages.config +++ b/Mongo.Migration.Test/packages.config @@ -3,6 +3,7 @@ + diff --git a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs index c588516..c0f2e23 100644 --- a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Documents.Locators { - internal class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator + public class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator { public override DocumentVersion? GetLocateOrNull(Type identifier) { diff --git a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs index 5ab11da..d98768e 100644 --- a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Documents.Locators { - internal class StartUpVersionLocator : AbstractLocator, IStartUpVersionLocator + public class StartUpVersionLocator : AbstractLocator, IStartUpVersionLocator { public override DocumentVersion? GetLocateOrNull(Type identifier) { diff --git a/Mongo.Migration/Migrations/CollectionMigrationRunner.cs b/Mongo.Migration/Migrations/CollectionMigrationRunner.cs index a8cd2d6..15918ea 100644 --- a/Mongo.Migration/Migrations/CollectionMigrationRunner.cs +++ b/Mongo.Migration/Migrations/CollectionMigrationRunner.cs @@ -10,7 +10,7 @@ namespace Mongo.Migration.Migrations { - internal class CollectionMigrationRunner : ICollectionMigrationRunner + public class CollectionMigrationRunner : ICollectionMigrationRunner { private readonly IMongoClient _client; diff --git a/Mongo.Migration/Migrations/ICollectionMigrationRunner.cs b/Mongo.Migration/Migrations/ICollectionMigrationRunner.cs index 466e863..3ab576a 100644 --- a/Mongo.Migration/Migrations/ICollectionMigrationRunner.cs +++ b/Mongo.Migration/Migrations/ICollectionMigrationRunner.cs @@ -2,7 +2,7 @@ namespace Mongo.Migration.Migrations { - internal interface ICollectionMigrationRunner + public interface ICollectionMigrationRunner { void RunAll(); } diff --git a/Mongo.Migration/Migrations/IMigrationRunner.cs b/Mongo.Migration/Migrations/IMigrationRunner.cs index 78f5593..0a5b76c 100644 --- a/Mongo.Migration/Migrations/IMigrationRunner.cs +++ b/Mongo.Migration/Migrations/IMigrationRunner.cs @@ -4,7 +4,7 @@ namespace Mongo.Migration.Migrations { - internal interface IMigrationRunner + public interface IMigrationRunner { void Run(Type type, BsonDocument document, DocumentVersion to); diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs index 2913426..fff5991 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Migrations.Locators { - internal class TypeMigrationDependencyLocator : MigrationLocator + public class TypeMigrationDependencyLocator : MigrationLocator { private readonly IContainerProvider _containerProvider; diff --git a/Mongo.Migration/Migrations/MigrationRunner.cs b/Mongo.Migration/Migrations/MigrationRunner.cs index effd4ca..c035bf4 100644 --- a/Mongo.Migration/Migrations/MigrationRunner.cs +++ b/Mongo.Migration/Migrations/MigrationRunner.cs @@ -8,7 +8,7 @@ namespace Mongo.Migration.Migrations { - internal class MigrationRunner : IMigrationRunner + public class MigrationRunner : IMigrationRunner { private readonly IMigrationLocator _migrationLocator; diff --git a/Mongo.Migration/MongoMigration.cs b/Mongo.Migration/MongoMigration.cs index cd32032..6311e78 100644 --- a/Mongo.Migration/MongoMigration.cs +++ b/Mongo.Migration/MongoMigration.cs @@ -4,7 +4,7 @@ namespace Mongo.Migration { - internal class MongoMigration : IMongoMigration + public class MongoMigration : IMongoMigration { private readonly ICollectionLocator _collectionLocator; private readonly IStartUpVersionLocator _startUpVersionLocator; diff --git a/Mongo.Migration/Services/IMigrationService.cs b/Mongo.Migration/Services/IMigrationService.cs index 5b63f8c..161a732 100644 --- a/Mongo.Migration/Services/IMigrationService.cs +++ b/Mongo.Migration/Services/IMigrationService.cs @@ -1,6 +1,6 @@ namespace Mongo.Migration.Services { - internal interface IMigrationService + public interface IMigrationService { void Migrate(); } diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs index 69f6096..621469a 100644 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Services.Interceptors { - internal interface IMigrationInterceptorFactory + public interface IMigrationInterceptorFactory { IBsonSerializer Create(Type type); } diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs index ba94db2..da62dea 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs @@ -4,7 +4,7 @@ namespace Mongo.Migration.Services.Interceptors { - internal class MigrationInterceptorFactory : IMigrationInterceptorFactory + public class MigrationInterceptorFactory : IMigrationInterceptorFactory { private readonly IMigrationRunner _migrationRunner; private readonly IVersionService _versionService; diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs index 51eb416..33cb588 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs @@ -5,7 +5,7 @@ using MongoDB.Bson.Serialization; namespace Mongo.Migration.Services.Interceptors - +{ internal class MigrationInterceptorProvider : IMigrationInterceptorProvider { private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 292517b..0c61f0e 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -8,14 +8,14 @@ namespace Mongo.Migration.Services { - internal class MigrationService : IMigrationService + public class MigrationService : IMigrationService { private readonly ILogger _logger; private readonly ICollectionMigrationRunner _migrationRunner; - private readonly MigrationInterceptorProvider _provider; + private readonly IMigrationInterceptorProvider _provider; private readonly DocumentVersionSerializer _serializer; - public MigrationService(DocumentVersionSerializer serializer, MigrationInterceptorProvider provider, + public MigrationService(DocumentVersionSerializer serializer, IMigrationInterceptorProvider provider, ICollectionMigrationRunner migrationRunner) : this(serializer, provider, NullLoggerFactory.Instance) { @@ -24,7 +24,7 @@ public MigrationService(DocumentVersionSerializer serializer, MigrationIntercept private MigrationService( DocumentVersionSerializer serializer, - MigrationInterceptorProvider provider, + IMigrationInterceptorProvider provider, ILoggerFactory loggerFactory) { _serializer = serializer; diff --git a/Mongo.Migration/Services/VersionService.cs b/Mongo.Migration/Services/VersionService.cs index 82dcfea..abec766 100644 --- a/Mongo.Migration/Services/VersionService.cs +++ b/Mongo.Migration/Services/VersionService.cs @@ -11,7 +11,7 @@ namespace Mongo.Migration.Services { - internal class VersionService : IVersionService + public class VersionService : IVersionService { private static readonly string VERSION_FIELD_NAME = "Version"; diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs index 463d774..76a6a8d 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs @@ -37,7 +37,7 @@ private static void RegisterDefaults(IServiceCollection services, IMongoMigratio services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Mongo.Migration/Startup/Static/ComponentRegistry.cs b/Mongo.Migration/Startup/Static/ComponentRegistry.cs index e72650f..0d24560 100644 --- a/Mongo.Migration/Startup/Static/ComponentRegistry.cs +++ b/Mongo.Migration/Startup/Static/ComponentRegistry.cs @@ -57,7 +57,7 @@ private void RegisterDefaults() _containerAdapter.Register(); _containerAdapter.Register(); - _containerAdapter.Register(); + _containerAdapter.Register(); _containerAdapter.Register(); } From ca98503fbe380cc5d79c17e22a948a2e3b82a92d Mon Sep 17 00:00:00 2001 From: Darren Hull Date: Tue, 24 Nov 2020 15:55:41 +0000 Subject: [PATCH 4/5] make MigrationInterceptorProvider public --- .../Services/Interceptors/MigrationInterceptorProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs index 33cb588..bcb16d0 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Services.Interceptors { - internal class MigrationInterceptorProvider : IMigrationInterceptorProvider + public class MigrationInterceptorProvider : IMigrationInterceptorProvider { private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; From 71d835247839d179dbf1bf434f5b0fab2a4e68c7 Mon Sep 17 00:00:00 2001 From: Darren Hull Date: Wed, 6 Jan 2021 11:10:59 +0000 Subject: [PATCH 5/5] added migration initialisation method --- Mongo.Migration/Migrations/IMigration.cs | 4 ++++ .../Migrations/Locators/IMigrationLocator.cs | 4 ++++ .../Migrations/Locators/MigrationLocator.cs | 23 +++++++++++++++++-- .../TypeMigrationDependencyLocator.cs | 2 ++ Mongo.Migration/Migrations/Migration.cs | 6 +++++ Mongo.Migration/MongoMigration.cs | 2 +- 6 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Mongo.Migration/Migrations/IMigration.cs b/Mongo.Migration/Migrations/IMigration.cs index da4db0d..4772ecf 100644 --- a/Mongo.Migration/Migrations/IMigration.cs +++ b/Mongo.Migration/Migrations/IMigration.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Mongo.Migration.Documents; using MongoDB.Bson; @@ -13,5 +14,8 @@ public interface IMigration void Up(BsonDocument document); void Down(BsonDocument document); + + void Initialise(); + } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs index 3b1b830..4987041 100644 --- a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs @@ -17,5 +17,9 @@ public interface IMigrationLocator DocumentVersion GetLatestVersion(Type type); void Locate(); + + void LocateAndInitialiseMigrations(); + + void InitialiseMigrations(); } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index 33c3fa0..af7c7fc 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -24,7 +24,7 @@ protected IDictionary> Migrations get { if (_migrations == null) - Locate(); + LocateAndInitialiseMigrations(); if (_migrations.NullOrEmpty()) throw new NoMigrationsFoundException(); @@ -81,7 +81,14 @@ public DocumentVersion GetLatestVersion(Type type) } public abstract void Locate(); - + + public void LocateAndInitialiseMigrations() + { + Locate(); + InitialiseMigrations(); + } + + private static IEnumerable GetAssemblies() { var location = AppDomain.CurrentDomain.BaseDirectory; @@ -97,5 +104,17 @@ private static IEnumerable GetAssemblies() return assemblies; } + + + public void InitialiseMigrations() + { + foreach (var migrationType in Migrations) + { + foreach (var migration in migrationType.Value) + { + migration?.Initialise(); + } + } + } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs index fff5991..6f65845 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs @@ -24,6 +24,8 @@ where typeof(IMigration).IsAssignableFrom(type) && !type.IsAbstract select type).Distinct(); Migrations = migrationTypes.Select(GetMigrationInstance).ToMigrationDictionary(); + + } private IMigration GetMigrationInstance(Type type) diff --git a/Mongo.Migration/Migrations/Migration.cs b/Mongo.Migration/Migrations/Migration.cs index 35988c4..f82ae6e 100644 --- a/Mongo.Migration/Migrations/Migration.cs +++ b/Mongo.Migration/Migrations/Migration.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Mongo.Migration.Documents; using MongoDB.Bson; @@ -18,5 +19,10 @@ protected Migration(string version) public abstract void Up(BsonDocument document); public abstract void Down(BsonDocument document); + + public virtual void Initialise() + { + + } } } \ No newline at end of file diff --git a/Mongo.Migration/MongoMigration.cs b/Mongo.Migration/MongoMigration.cs index 6311e78..b6f48ec 100644 --- a/Mongo.Migration/MongoMigration.cs +++ b/Mongo.Migration/MongoMigration.cs @@ -24,7 +24,7 @@ public MongoMigration(IMigrationLocator migrationLocator, IRuntimeVersionLocator public void Run() { - _migrationLocator.Locate(); + _migrationLocator.LocateAndInitialiseMigrations(); _runtimeVersionLocator.Locate(); _collectionLocator.Locate(); _startUpVersionLocator.Locate();