Skip to content

Commit 1180448

Browse files
author
maximv
committed
fixed: #347
1 parent aa1295f commit 1180448

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

src/DryIoc/Container.cs

+10-9
Original file line numberDiff line numberDiff line change
@@ -5041,7 +5041,7 @@ public static Expression GetLazyExpressionOrDefault(Request request, bool nullWr
50415041

50425042
// creates: r => new Lazy(() => r.Resolve<X>(key))
50435043
// or for singleton : r => new Lazy(() => r.Root.Resolve<X>(key))
5044-
var serviceExpr = Resolver.CreateResolutionExpression(serviceRequest);
5044+
var serviceExpr = Resolver.CreateResolutionExpression(serviceRequest, openResolutionScope: false, asResolutionCall: true);
50455045

50465046
// The conversion is required in .NET 3.5 to handle lack of covariance for Func<out T>
50475047
// So that Func<Derived> may be used for Func<Base>
@@ -5087,7 +5087,7 @@ private static Expression GetFuncOrActionExpressionOrDefault(Request request)
50875087
var serviceRequest = request.Push(serviceType, flags: RequestFlags.IsWrappedInFunc | RequestFlags.IsDirectlyWrappedInFunc);
50885088
var container = request.Container;
50895089
var serviceExpr = container.Rules.FuncAndLazyWithoutRegistration && !isAction
5090-
? Resolver.CreateResolutionExpression(serviceRequest)
5090+
? Resolver.CreateResolutionExpression(serviceRequest, openResolutionScope: false, asResolutionCall: true)
50915091
: container.ResolveFactory(serviceRequest)?.GetExpressionOrDefault(serviceRequest);
50925092

50935093
if (serviceExpr == null)
@@ -7863,7 +7863,8 @@ public static T New<T>(this IResolver resolver, Made.TypedMade<T> made,
78637863
private static readonly ConstantExpression _nullTypeExpr = Constant(null, typeof(Type));
78647864
private static readonly ConstantExpression _nullExpr = Constant(null, typeof(object));
78657865

7866-
internal static Expression CreateResolutionExpression(Request request, bool opensResolutionScope = false)
7866+
internal static Expression CreateResolutionExpression(Request request,
7867+
bool openResolutionScope = false, bool asResolutionCall = false)
78677868
{
78687869
if (request.Rules.DependencyResolutionCallExprs != null &&
78697870
request.Factory != null && !request.Factory.HasRuntimeState)
@@ -7889,7 +7890,7 @@ internal static Expression CreateResolutionExpression(Request request, bool open
78897890
: container.GetConstantExpression(details.ServiceKey, typeof(object));
78907891

78917892
Expression resolverExpr;
7892-
if (!opensResolutionScope)
7893+
if (!openResolutionScope)
78937894
{
78947895
resolverExpr = ResolverContext.GetRootOrSelfExpr(request);
78957896
}
@@ -7909,9 +7910,9 @@ internal static Expression CreateResolutionExpression(Request request, bool open
79097910
}
79107911

79117912
var parentFlags = default(RequestFlags);
7912-
if (opensResolutionScope)
7913+
if (openResolutionScope)
79137914
parentFlags |= RequestFlags.OpensResolutionScope;
7914-
if ((request.Flags & RequestFlags.StopRecursiveDependencyCheck) != 0)
7915+
if (asResolutionCall || (request.Flags & RequestFlags.StopRecursiveDependencyCheck) != 0)
79157916
parentFlags |= RequestFlags.StopRecursiveDependencyCheck;
79167917

79177918
// Only parent is converted to be passed to Resolve.
@@ -9857,7 +9858,7 @@ public virtual Expression GetExpressionOrDefault(Request request)
98579858
&& request.GetActualServiceType() != typeof(void));
98589859

98599860
if (getAsRsolutionCall)
9860-
return Resolver.CreateResolutionExpression(request, setup.OpenResolutionScope);
9861+
return Resolver.CreateResolutionExpression(request, setup.OpenResolutionScope, setup.AsResolutionCall);
98619862

98629863
var cacheExpression =
98639864
Caching != FactoryCaching.DoNotCache &&
@@ -9986,7 +9987,7 @@ cacheEntry.Value.ScopeNameOrDependencyCount is Container.Registry.TransientDepen
99869987
((Container)container).CacheFactoryExpression(request.FactoryID, serviceExpr, reuse,
99879988
depCount, cacheEntry);
99889989

9989-
return Resolver.CreateResolutionExpression(request, false);
9990+
return Resolver.CreateResolutionExpression(request);
99909991
}
99919992
}
99929993
}
@@ -11333,7 +11334,7 @@ public override Expression GetExpressionOrDefault(Request request)
1133311334
if (// preventing recursion
1133411335
(request.Flags & RequestFlags.IsGeneratedResolutionDependencyExpression) == 0 && !request.IsResolutionCall &&
1133511336
(Setup.AsResolutionCall || Setup.AsResolutionCallForExpressionGeneration && request.Rules.UsedForExpressionGeneration))
11336-
return Resolver.CreateResolutionExpression(request.WithResolvedFactory(this), Setup.OpenResolutionScope);
11337+
return Resolver.CreateResolutionExpression(request.WithResolvedFactory(this), Setup.OpenResolutionScope, Setup.AsResolutionCall);
1133711338

1133811339
// First look for decorators if it is not already a decorator
1133911340
var serviceType = request.ServiceType;

test/DryIoc.IssuesTests/GHIssue347_The_AsResolutionCall_option_and_or_WithFuncAndLazyWithoutRegistration_rule_are_not_respected.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace DryIoc.IssuesTests
66
[TestFixture]
77
public class GHIssue347_The_AsResolutionCall_option_and_or_WithFuncAndLazyWithoutRegistration_rule_are_not_respected
88
{
9-
[Test, Ignore("fixme")]
9+
[Test]
1010
public void RecursiveDependencyIssue_with_asResolutionCall()
1111
{
1212
var container = new Container();
@@ -21,7 +21,7 @@ public void RecursiveDependencyIssue_with_asResolutionCall()
2121
Assert.AreSame(actual, serviceA);
2222
}
2323

24-
[Test, Ignore("fixme")]
24+
[Test]
2525
public void RecursiveDependencyIssue_WithFuncAndLazyWithoutRegistration()
2626
{
2727
var container = new Container(rules => rules.WithFuncAndLazyWithoutRegistration());

0 commit comments

Comments
 (0)