Skip to content

Commit 13624c8

Browse files
authored
Merge pull request #582 from seesharper/bugfix-dispose-decorators-as-singleton
Bugfix dispose decorators as singleton
2 parents 272c770 + ac1d8af commit 13624c8

File tree

8 files changed

+92
-17
lines changed

8 files changed

+92
-17
lines changed

.github/workflows/main.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ jobs:
1111
- name: Install .Net Core
1212
uses: actions/setup-dotnet@v2.0.0
1313
with:
14-
dotnet-version: 6.0.400
14+
dotnet-version: |
15+
6.0.x
16+
7.0.x
1517
- name: Install dotnet-script
1618
run: dotnet tool install --global dotnet-script
1719
- name: Install dotnet-ilverify

build/build.csx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ using static ReleaseManagement;
1111
[StepDescription("Runs the tests with test coverage")]
1212
Step testcoverage = () =>
1313
{
14-
DotNet.TestWithCodeCoverage(Path.GetDirectoryName(BuildContext.TestProjects[0]), BuildContext.TestCoverageArtifactsFolder, BuildContext.CodeCoverageThreshold, "net6.0");
14+
DotNet.TestWithCodeCoverage(Path.GetDirectoryName(BuildContext.TestProjects[0]), BuildContext.TestCoverageArtifactsFolder, BuildContext.CodeCoverageThreshold, "net7.0");
1515
};
1616

1717
[StepDescription("Runs all the tests for all target frameworks")]

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "6.0.100",
3+
"version": "7.0.100",
44
"rollForward": "latestFeature"
55
}
66
}

src/LightInject.Tests/DecoratorTests.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,49 @@ public void GetInstance_DecoratorWithBaseGenericConstraint_AppliesDecorator()
569569
Assert.IsType<FooDecoratorWithBarBaseConstraint<InheritedBar>>(instance);
570570
}
571571

572+
[Fact]
573+
public void GetInstance_DecoratorImplementingDisposable_DisposesDecorator()
574+
{
575+
var container = CreateContainer();
576+
container.Register<IFoo, DisposableFoo>(new PerScopeLifetime());
577+
container.Decorate<IFoo, DisposableFooDecorator>();
578+
DisposableFooDecorator instance = null;
579+
using (var scope = container.BeginScope())
580+
{
581+
instance = (DisposableFooDecorator)scope.GetInstance<IFoo>();
582+
}
583+
584+
Assert.True(instance.Disposed);
585+
}
586+
587+
[Fact]
588+
public void GetInstance_DecoratorImplementingDisposableRegisteredAsSingleton_DisposesDecorator()
589+
{
590+
var container = CreateContainer();
591+
container.Register<IFoo, DisposableFoo>(new PerContainerLifetime());
592+
container.Decorate<IFoo, DisposableFooDecorator>();
593+
DisposableFooDecorator instance = null;
594+
595+
596+
instance = (DisposableFooDecorator)container.GetInstance<IFoo>();
597+
container.Dispose();
598+
Assert.True(instance.Disposed);
599+
}
600+
601+
[Fact]
602+
public void GetInstance_ServicaeAsFactoryAndDecoratorImplementingDisposableRegisteredAsSingleton_DisposesDecorator()
603+
{
604+
var container = CreateContainer();
605+
container.Register<IFoo>(sf => new DisposableFoo(), new PerContainerLifetime());
606+
container.Decorate<IFoo, DisposableFooDecorator>();
607+
DisposableFooDecorator instance = null;
608+
609+
610+
instance = (DisposableFooDecorator)container.GetInstance<IFoo>();
611+
container.Dispose();
612+
Assert.True(instance.Disposed);
613+
}
614+
572615
private IFoo CreateFooWithDependency(IServiceFactory factory)
573616
{
574617
return new FooWithDependency(factory.GetInstance<IBar>());
@@ -584,4 +627,19 @@ private static FooDecorator GetFooDecorator(IFoo target)
584627
return new FooDecorator(target);
585628
}
586629
}
630+
631+
632+
public class DisposableFooDecorator : IFoo, IDisposable
633+
{
634+
public bool Disposed { get; set; }
635+
636+
public DisposableFooDecorator(IFoo foo)
637+
{
638+
}
639+
640+
public void Dispose()
641+
{
642+
Disposed = true;
643+
}
644+
}
587645
}

src/LightInject.Tests/LightInject.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project Sdk="Microsoft.NET.Sdk">
33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
4+
<TargetFramework>net7.0</TargetFramework>
55
<NoWarn>$(NoWarn);CS0579</NoWarn>
66
<TestTargetFrameworks>net6.0;netstandard2.0</TestTargetFrameworks>
77
<TestTargetFramework>net6.0</TestTargetFramework>

src/LightInject.Tests/ServiceContainerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,7 @@ public void CanGetInstance_KnownService_ReturnsTrue(string serviceName)
11361136
var canCreateInstance = container.CanGetInstance(typeof(IFoo), serviceName);
11371137
Assert.True(canCreateInstance);
11381138
}
1139-
1139+
11401140
[Theory]
11411141
[MemberData(nameof(StringDataGenerator.NullOrWhiteSpaceData), MemberType = typeof(StringDataGenerator))]
11421142
public void CanGetInstance_UnknownService_ReturnFalse(string serviceName)

src/LightInject/LightInject.cs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3896,18 +3896,18 @@ private void EmitNewInstance(ServiceRegistration serviceRegistration, IEmitter e
38963896
}
38973897
}
38983898

3899-
if (serviceRegistration.Lifetime is PerContainerLifetime && IsNotServiceFactory(serviceRegistration.ServiceType))
3900-
{
3901-
var closedGenericTrackInstanceMethod = OpenGenericTrackInstanceMethod.MakeGenericMethod(emitter.StackType);
3902-
var containerIndex = constants.Add(this);
3903-
emitter.PushConstant(containerIndex, typeof(ServiceContainer));
3904-
emitter.Emit(OpCodes.Call, closedGenericTrackInstanceMethod);
3905-
}
3899+
// if (serviceRegistration.Lifetime is PerContainerLifetime && IsNotServiceFactory(serviceRegistration.ServiceType))
3900+
// {
3901+
// var closedGenericTrackInstanceMethod = OpenGenericTrackInstanceMethod.MakeGenericMethod(emitter.StackType);
3902+
// var containerIndex = constants.Add(this);
3903+
// emitter.PushConstant(containerIndex, typeof(ServiceContainer));
3904+
// emitter.Emit(OpCodes.Call, closedGenericTrackInstanceMethod);
3905+
// }
39063906

3907-
bool IsNotServiceFactory(Type serviceType)
3908-
{
3909-
return !typeof(IServiceFactory).GetTypeInfo().IsAssignableFrom(serviceType.GetTypeInfo());
3910-
}
3907+
// bool IsNotServiceFactory(Type serviceType)
3908+
// {
3909+
// return !typeof(IServiceFactory).GetTypeInfo().IsAssignableFrom(serviceType.GetTypeInfo());
3910+
// }
39113911
}
39123912

39133913
private void EmitDecorators(ServiceRegistration serviceRegistration, IEnumerable<DecoratorRegistration> serviceDecorators, IEmitter emitter, Action<IEmitter> decoratorTargetEmitMethod)
@@ -4697,6 +4697,15 @@ private void EmitNewInstanceWithDecorators(ServiceRegistration serviceRegistrati
46974697
EmitNewInstance(serviceRegistration, emitter);
46984698
}
46994699

4700+
if (serviceRegistration.Lifetime is PerContainerLifetime && IsNotServiceFactory(serviceRegistration.ServiceType))
4701+
{
4702+
var closedGenericTrackInstanceMethod = OpenGenericTrackInstanceMethod.MakeGenericMethod(emitter.StackType);
4703+
var containerIndex = constants.Add(this);
4704+
emitter.PushConstant(containerIndex, typeof(ServiceContainer));
4705+
emitter.Emit(OpCodes.Call, closedGenericTrackInstanceMethod);
4706+
}
4707+
4708+
47004709
var processors = initializers.Items.Where(i => i.Predicate(serviceRegistration)).ToArray();
47014710
if (processors.Length == 0)
47024711
{
@@ -4723,6 +4732,12 @@ private void EmitNewInstanceWithDecorators(ServiceRegistration serviceRegistrati
47234732
}
47244733

47254734
emitter.Push(instanceVariable);
4735+
4736+
4737+
bool IsNotServiceFactory(Type serviceType)
4738+
{
4739+
return !typeof(IServiceFactory).GetTypeInfo().IsAssignableFrom(serviceType.GetTypeInfo());
4740+
}
47264741
}
47274742

47284743
private int GetInstanceDelegateIndex(ServiceRegistration serviceRegistration, Action<IEmitter> emitMethod)

src/LightInject/LightInject.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<Project Sdk="Microsoft.NET.Sdk">
33
<PropertyGroup>
44
<TargetFrameworks>net6.0;netstandard2.0;netcoreapp3.1;net462</TargetFrameworks>
5-
<Version>6.6.1</Version>
5+
<Version>6.6.2</Version>
66
<Authors>Bernhard Richter</Authors>
77
<PackageProjectUrl>https://www.lightinject.net</PackageProjectUrl>
88
<RepositoryType>git</RepositoryType>

0 commit comments

Comments
 (0)