From f32dc7b86e160606361b93f6da5b058047a85fa9 Mon Sep 17 00:00:00 2001 From: Bernhard Richter Date: Mon, 19 Oct 2020 16:40:31 +0200 Subject: [PATCH 1/3] Added generic initialize method and test --- .../ServiceContainerTests.cs | 14 +++++ src/LightInject/LightInject.cs | 54 +++++++++++-------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/LightInject.Tests/ServiceContainerTests.cs b/src/LightInject.Tests/ServiceContainerTests.cs index 8b0efaf5..64258db3 100644 --- a/src/LightInject.Tests/ServiceContainerTests.cs +++ b/src/LightInject.Tests/ServiceContainerTests.cs @@ -1686,6 +1686,20 @@ public void GetInstance_UsingInitializer_ReturnsInstance() Assert.IsAssignableFrom(foo.Bar); } + [Fact] + public void GetInstance_UsingInitializerWithDecoratedService_PassesDecoratorAsInstance() + { + var container = CreateContainer(); + container.Register(); + container.Decorate(); + container.Initialize((factory, instance) => + { + Assert.IsType(instance); + }); + + container.GetInstance(); + } + #if NET452 || NET40 || NET46 || NETCOREAPP2_0 [Fact] diff --git a/src/LightInject/LightInject.cs b/src/LightInject/LightInject.cs index 19a40233..1a449424 100644 --- a/src/LightInject/LightInject.cs +++ b/src/LightInject/LightInject.cs @@ -1607,6 +1607,16 @@ public static IServiceRegistry Override(this IService return registration; }); } + + /// + /// Allows post-processing of a service instance. + /// + /// The target . + /// An action delegate that exposes the created service instance. + /// The type of service to initialize. + /// The , for chaining calls. + public static IServiceRegistry Initialize(this IServiceRegistry serviceRegistry, Action processor) + => serviceRegistry.Initialize(sr => sr.ServiceType == typeof(TService), (factory, instance) => processor(factory, (TService)instance)); } /// @@ -3865,28 +3875,6 @@ private void EmitNewInstance(ServiceRegistration serviceRegistration, IEmitter e EmitNewInstanceUsingImplementingType(emitter, constructionInfo, null); } } - - var processors = initializers.Items.Where(i => i.Predicate(serviceRegistration)).ToArray(); - if (processors.Length == 0) - { - return; - } - - LocalBuilder instanceVariable = emitter.DeclareLocal(serviceRegistration.ServiceType); - emitter.Store(instanceVariable); - foreach (var postProcessor in processors) - { - Type delegateType = postProcessor.Initialize.GetType(); - var delegateIndex = constants.Add(postProcessor.Initialize); - emitter.PushConstant(delegateIndex, delegateType); - var serviceFactoryIndex = constants.Add(this); - emitter.PushConstant(serviceFactoryIndex, typeof(IServiceFactory)); - emitter.Push(instanceVariable); - MethodInfo invokeMethod = delegateType.GetTypeInfo().GetDeclaredMethod("Invoke"); - emitter.Call(invokeMethod); - } - - emitter.Push(instanceVariable); } private void EmitDecorators(ServiceRegistration serviceRegistration, IEnumerable serviceDecorators, IEmitter emitter, Action decoratorTargetEmitMethod) @@ -4670,6 +4658,28 @@ private void EmitNewInstanceWithDecorators(ServiceRegistration serviceRegistrati { EmitNewInstance(serviceRegistration, emitter); } + + var processors = initializers.Items.Where(i => i.Predicate(serviceRegistration)).ToArray(); + if (processors.Length == 0) + { + return; + } + + LocalBuilder instanceVariable = emitter.DeclareLocal(serviceRegistration.ServiceType); + emitter.Store(instanceVariable); + foreach (var postProcessor in processors) + { + Type delegateType = postProcessor.Initialize.GetType(); + var delegateIndex = constants.Add(postProcessor.Initialize); + emitter.PushConstant(delegateIndex, delegateType); + var serviceFactoryIndex = constants.Add(this); + emitter.PushConstant(serviceFactoryIndex, typeof(IServiceFactory)); + emitter.Push(instanceVariable); + MethodInfo invokeMethod = delegateType.GetTypeInfo().GetDeclaredMethod("Invoke"); + emitter.Call(invokeMethod); + } + + emitter.Push(instanceVariable); } private void EmitLifetime(ServiceRegistration serviceRegistration, Action emitMethod, IEmitter emitter) From 617b031344231d8d4e2d95a4f84157272a6fb773 Mon Sep 17 00:00:00 2001 From: Bernhard Richter Date: Mon, 19 Oct 2020 23:11:14 +0200 Subject: [PATCH 2/3] Ensure scope is passed to iniiialize method --- src/LightInject.Tests/ServiceContainerTests.cs | 17 +++++++++++++++++ src/LightInject/LightInject.cs | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/src/LightInject.Tests/ServiceContainerTests.cs b/src/LightInject.Tests/ServiceContainerTests.cs index 64258db3..ebf1e689 100644 --- a/src/LightInject.Tests/ServiceContainerTests.cs +++ b/src/LightInject.Tests/ServiceContainerTests.cs @@ -1700,6 +1700,23 @@ public void GetInstance_UsingInitializerWithDecoratedService_PassesDecoratorAsIn container.GetInstance(); } + [Fact] + public void GetInstance_UsingInitializer_PassesScopeAsServiceFactory() + { + var container = CreateContainer(); + container.Register(); + IServiceFactory passedFactory = null; + container.Initialize((factory, instance) => { passedFactory = factory; }); + + using (var scope = container.BeginScope()) + { + scope.GetInstance(); + Assert.Same(scope, passedFactory); + } + } + + + #if NET452 || NET40 || NET46 || NETCOREAPP2_0 [Fact] diff --git a/src/LightInject/LightInject.cs b/src/LightInject/LightInject.cs index 1a449424..18cf3bf3 100644 --- a/src/LightInject/LightInject.cs +++ b/src/LightInject/LightInject.cs @@ -4672,8 +4672,13 @@ private void EmitNewInstanceWithDecorators(ServiceRegistration serviceRegistrati Type delegateType = postProcessor.Initialize.GetType(); var delegateIndex = constants.Add(postProcessor.Initialize); emitter.PushConstant(delegateIndex, delegateType); + var serviceFactoryIndex = constants.Add(this); emitter.PushConstant(serviceFactoryIndex, typeof(IServiceFactory)); + var scopeManagerIndex = CreateScopeManagerIndex(); + emitter.PushConstant(scopeManagerIndex, typeof(IScopeManager)); + emitter.PushArgument(1); + emitter.Emit(OpCodes.Call, ServiceFactoryLoader.LoadServiceFactoryMethod); emitter.Push(instanceVariable); MethodInfo invokeMethod = delegateType.GetTypeInfo().GetDeclaredMethod("Invoke"); emitter.Call(invokeMethod); From 15be522fe305956569cca92899e19f76cb067482 Mon Sep 17 00:00:00 2001 From: Bernhard Richter Date: Mon, 19 Oct 2020 23:12:19 +0200 Subject: [PATCH 3/3] Bumped to version 6.4.0 --- src/LightInject/LightInject.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LightInject/LightInject.csproj b/src/LightInject/LightInject.csproj index 2ae5639b..154b6465 100644 --- a/src/LightInject/LightInject.csproj +++ b/src/LightInject/LightInject.csproj @@ -2,7 +2,7 @@ netcoreapp2.0;netstandard2.0;netstandard1.6;netstandard1.3;netstandard1.1;net46;net452 - 6.3.6 + 6.4.0 Bernhard Richter https://www.lightinject.net git