Skip to content

Commit 3199c6e

Browse files
committed
added ResolveFactory(ServiceInfo serviceInfo), and ResolveExpression for #632
1 parent 4697be1 commit 3199c6e

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

src/DryIoc/Container.cs

+24-5
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,17 @@ public Factory ResolveFactory(Request request)
972972
: ThrowUnableToResolveOrGetDefault(request, factory);
973973
}
974974

975+
/// <inheritdoc />
976+
public Factory ResolveFactory(ServiceInfo serviceInfo) =>
977+
ResolveFactory(Request.Create(this, serviceInfo));
978+
979+
/// <inheritdoc />
980+
public Expression ResolveExpression(ServiceInfo serviceInfo)
981+
{
982+
var request = Request.Create(this, serviceInfo);
983+
return ResolveFactory(request)?.GetExpressionOrDefault(request);
984+
}
985+
975986
internal static T ThrowUnableToResolveOrGetDefault<T>(Request request, T defaultResult)
976987
{
977988
if (request.IfUnresolved == IfUnresolved.Throw)
@@ -9574,8 +9585,7 @@ public static ServiceDetails OfServiceKey(object serviceKey) =>
95749585
/// <summary>Creates new details out of provided settings and not null `serviceKey`.</summary>
95759586
[MethodImpl((MethodImplOptions)256)]
95769587
public static ServiceDetails WithServiceKey(ServiceDetails d, object serviceKey) =>
9577-
new ServiceDetails(d.RequiredServiceType, d.IfUnresolved, serviceKey, d.MetadataKey, d.Metadata, d.DefaultValue,
9578-
hasCustomValue: false);
9588+
new ServiceDetails(d.RequiredServiceType, d.IfUnresolved, serviceKey, d.MetadataKey, d.Metadata, d.DefaultValue, hasCustomValue: false);
95799589

95809590
/// <summary>Service type to search in registry. Should be assignable to user requested service type.</summary>
95819591
public readonly Type RequiredServiceType;
@@ -14995,11 +15005,20 @@ IContainer With(IResolverContext parent, Rules rules, IScopeContext scopeContext
1499515005
/// You may use Factory <see cref="Setup.AsResolutionRoot"/>.</summary>
1499615006
GeneratedExpressions GenerateResolutionExpressions(Func<IEnumerable<ServiceRegistrationInfo>, IEnumerable<ServiceInfo>> getRoots = null, bool allowRuntimeState = false);
1499715007

14998-
/// <summary>Searches for requested factory in registry, and then using <see cref="DryIoc.Rules.UnknownServiceResolvers"/>.</summary>
14999-
/// <param name="request">Factory request.</param>
15000-
/// <returns>Found factory, otherwise null if <see cref="Request.IfUnresolved"/> is set to <see cref="IfUnresolved.ReturnDefault"/>.</returns>
15008+
/// <summary>Searches for the requested factory in registry or in the Dynamic registrations.
15009+
/// Plus generates the closed-generic factory for the found open-generic one.</summary>
15010+
/// <returns>Resolved factory, otherwise null if <see cref="Request.IfUnresolved"/> is set to <see cref="IfUnresolved.ReturnDefault"/>.</returns>
1500115011
Factory ResolveFactory(Request request);
1500215012

15013+
/// <summary>Searches for the requested factory specified by the `ServiceInfo` in registry or in the Dynamic registrations.
15014+
/// Plus generates the closed-generic factory for the found open-generic one.</summary>
15015+
/// <returns>Resolved factory, otherwise null if <see cref="Request.IfUnresolved"/> is set to <see cref="IfUnresolved.ReturnDefault"/>.</returns>
15016+
Factory ResolveFactory(ServiceInfo serviceInfo);
15017+
15018+
/// <summary>Resolves the factory and then gets the result expression</summary>
15019+
/// <returns>Resolved expression, otherwise null if <see cref="Request.IfUnresolved"/> is set to <see cref="IfUnresolved.ReturnDefault"/>.</returns>
15020+
Expression ResolveExpression(ServiceInfo serviceInfo);
15021+
1500315022
/// <summary>Searches for registered service factory and returns it, or null if not found.
1500415023
/// Will use <see cref="DryIoc.Rules.FactorySelector"/> if specified.</summary>
1500515024
/// <param name="request">Factory request.</param>

test/DryIoc.IssuesTests/GHIssue188_Custom_delegate_wrapper_resolving.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,9 @@ internal class CustomDelegateWrapper<TDelegate> : Factory where TDelegate : Syst
177177
public override Expression CreateExpressionOrDefault(Request request)
178178
{
179179
var originalFactoryType = GetOriginalFactoryType();
180-
var originalFactoryRequest = Request.Create(request.Container, originalFactoryType, request.ServiceKey);
181-
var originalFactory = originalFactoryRequest.Container.ResolveFactory(originalFactoryRequest);
182180

183-
var originalFactoryExpression = (LambdaExpression)originalFactory.GetExpressionOrDefault(originalFactoryRequest);
181+
var originalFactoryExpression =
182+
(LambdaExpression)request.Container.ResolveExpression(ServiceInfo.Of(originalFactoryType, request.ServiceKey));
184183

185184
var convertedFactoryExpression = Expression.Lambda<TDelegate>(originalFactoryExpression.Body, originalFactoryExpression.Parameters);
186185

0 commit comments

Comments
 (0)