diff --git a/src/DryIoc/Container.cs b/src/DryIoc/Container.cs index 1f2c247d..12242b35 100644 --- a/src/DryIoc/Container.cs +++ b/src/DryIoc/Container.cs @@ -4893,10 +4893,11 @@ public static class ResolverContext internal static readonly MethodInfo OpenScopeMethod = typeof(ResolverContext).GetTypeInfo().GetDeclaredMethod(nameof(OpenScope)); - /// Returns root or self resolver based on request. + /// Returns root resolver for the singletons or the non scoped dependency of singletons, + /// or the current resolver for the rest. public static Expression GetRootOrSelfExpr(Request request) => - request.Reuse is CurrentScopeReuse == false && - request.DirectParent.IsSingletonOrDependencyOfSingleton && + request.Reuse is CurrentScopeReuse == false && + request.DirectParent.IsSingletonOrDependencyOfSingleton && !request.OpensResolutionScope && request.Rules.ThrowIfDependencyHasShorterReuseLifespan ? RootOrSelfExpr @@ -11796,7 +11797,8 @@ public override Expression CreateExpressionOrDefault(Request request) { // GetConstant here is needed to check the runtime state rule var delegateExpr = request.Container.GetConstantExpression(_factoryDelegate); - var resolverExpr = ResolverContext.GetRootOrSelfExpr(request); + // Here we are using the simplified GetRootOrSelfExpr - if we injecting resolver in the singleton it should be the root container + var resolverExpr = request.Reuse is SingletonReuse ? ResolverContext.RootOrSelfExpr : FactoryDelegateCompiler.ResolverContextParamExpr; return Convert(Invoke(delegateExpr, resolverExpr), request.GetActualServiceType()); } diff --git a/test/DryIoc.IssuesTests/Issue530_Multi_tenancy_support.cs b/test/DryIoc.IssuesTests/Issue530_Multi_tenancy_support.cs index 1633019f..286fce81 100644 --- a/test/DryIoc.IssuesTests/Issue530_Multi_tenancy_support.cs +++ b/test/DryIoc.IssuesTests/Issue530_Multi_tenancy_support.cs @@ -51,14 +51,17 @@ public void No_cache_problem_between_Injected_singleton_and_scoped() c.Register(Reuse.Scoped); c.Register(); - Assert.IsInstanceOf(c.Resolve().Thing); + var user = c.Resolve(); + Assert.IsInstanceOf(user.Thing); using (var scope = c.OpenScope()) { - Assert.IsInstanceOf(scope.Resolve().Thing); + user = scope.Resolve(); + Assert.IsInstanceOf(user.Thing); } - Assert.IsInstanceOf(c.Resolve().Thing); + user = c.Resolve(); + Assert.IsInstanceOf(user.Thing); } public interface IThing {} diff --git a/test/DryIoc.Microsoft.DependencyInjection.Specification.Tests/GHIssue435_hangfire_use_dryioc_report_ContainerIsDisposed.cs b/test/DryIoc.Microsoft.DependencyInjection.Specification.Tests/GHIssue435_hangfire_use_dryioc_report_ContainerIsDisposed.cs index 696eb6b3..5708c6b1 100644 --- a/test/DryIoc.Microsoft.DependencyInjection.Specification.Tests/GHIssue435_hangfire_use_dryioc_report_ContainerIsDisposed.cs +++ b/test/DryIoc.Microsoft.DependencyInjection.Specification.Tests/GHIssue435_hangfire_use_dryioc_report_ContainerIsDisposed.cs @@ -10,18 +10,19 @@ namespace DryIoc.Microsoft.DependencyInjection.Specification.Tests [TestFixture] public class GHIssue435_hangfire_use_dryioc_report_ContainerIsDisposed : DependencyInjectionSpecificationTests { - protected override IServiceProvider CreateServiceProvider(IServiceCollection services) => DryIocAdapter.Create(services); + protected override IServiceProvider CreateServiceProvider(IServiceCollection services) => + DryIocAdapter.Create(services); - [Test, Ignore("failing")] + [Test] public void SingletonFactory_Test() { var collection = new ServiceCollection(); - + collection.AddSingleton(r => new SingletonFactory(r)); collection.AddTransient(); - - + var serviceProvider = CreateServiceProvider(collection); + var scopeFactory = serviceProvider.GetService(); ISingletonFactory singletonFactory; using (var scope = scopeFactory.CreateScope()) @@ -39,7 +40,6 @@ public interface IFakeSingletonService { } public class FakeService : IFakeService, IFakeScopedService, IFakeSingletonService, IDisposable { public bool Disposed { get; private set; } - public void Dispose() { if (Disposed)