Skip to content

Grace.DependencyInjection.Exceptions.RecursiveLocateException with Decoration in HostBuilder #25

Description

@Mike-E-angelo

Hello there,

I am exploring the use of this library, but am having some difficulty with decorations during the configuration of a host builder.

Here is the xUnit test I am developing:

[Fact]
async Task Grace()
{
	var host = new HostBuilder().UseGrace()
	                            .ConfigureServices(x => x.AddSingleton("Hello World!"))
	                            .ConfigureContainer<IInjectionScope>(x => x.Configure(y => y.ExportDecorator<string>(z => $"Decorated: {z}")))
	                            .Build();
	await host.StartAsync();

	host.Services.GetRequiredService<string>().Should().Be("Decorated: Hello World!");
}

When using the above, I get a rather lengthy error:


Grace.DependencyInjection.Exceptions.RecursiveLocateException : Recursive object graph detected
1 Importing System.String 
2 Importing System.String 
3 Importing System.String 
4 Importing System.String 
5 Importing System.String 
6 Importing System.String 
7 Importing System.String 
8 Importing System.String 
9 Importing System.String 
10 Importing System.String 
11 Importing System.String 
12 Importing System.String 
13 Importing System.String 
14 Importing System.String 
15 Importing System.String 
16 Importing System.String 
17 Importing System.String 
18 Importing System.String 
19 Importing System.String 
20 Importing System.String 

Dropped 60 entries

81 Importing System.String 
82 Importing System.String 
83 Importing System.String 
84 Importing System.String 
85 Importing System.String 
86 Importing System.String 
87 Importing System.String 
88 Importing System.String 
89 Importing System.String 
90 Importing System.String 
91 Importing System.String 
92 Importing System.String 
93 Importing System.String 
94 Importing System.String 
95 Importing System.String 
96 Importing System.String 
97 Importing System.String 
98 Importing System.String 
99 Importing System.String 
100 Importing System.String 

   at Grace.DependencyInjection.Impl.Expressions.ActivationExpressionRequest.NewRequest(Type activationType, IActivationStrategy requestingStrategy, Type injectedType, RequestType requestType, Object info, Boolean maintainPaths, Boolean carryData)
   at Grace.DependencyInjection.Impl.CompiledStrategies.CompiledInitializationDecoratorStrategy`1.InternalGetDecoratorActivationExpression(IInjectionScope scope, IActivationExpressionRequest request)
   at Grace.DependencyInjection.Impl.CompiledStrategies.CompiledInitializationDecoratorStrategy`1.GetDecoratorActivationExpression(IInjectionScope scope, IActivationExpressionRequest request, ICompiledLifestyle lifestyle)
   at Grace.DependencyInjection.Impl.Expressions.DecoratorActivationPathNode.GetActivationExpression(IInjectionScope scope, IActivationExpressionRequest request)
   at Grace.DependencyInjection.Impl.Expressions.ActivationExpressionBuilder.CreateDecoratedActivationStrategy(IInjectionScope scope, IActivationExpressionRequest request, ICompiledExportStrategy strategy, List`1 decorators)
   at Grace.DependencyInjection.Impl.Expressions.ActivationExpressionBuilder.DecorateExportStrategy(IInjectionScope scope, IActivationExpressionRequest request, ICompiledExportStrategy strategy)
   at Grace.DependencyInjection.Impl.InstanceStrategies.BaseInstanceExportStrategy.GetActivationExpression(IInjectionScope scope, IActivationExpressionRequest request)
   at Grace.DependencyInjection.Impl.Expressions.ActivationExpressionBuilder.ActivationExpressionForStrategy(IInjectionScope scope, IActivationExpressionRequest request, ICompiledExportStrategy strategy)
   at Grace.DependencyInjection.Impl.Expressions.ActivationExpressionBuilder.GetExpressionFromStrategyCollection(IInjectionScope scope, IActivationExpressionRequest request)
   at Grace.DependencyInjection.Impl.Expressions.ActivationExpressionBuilder.GetActivationExpressionFromStrategies(IInjectionScope scope, IActivationExpressionRequest request)
   at Grace.DependencyInjection.Impl.Expressions.ActivationExpressionBuilder.GetActivationExpression(IInjectionScope scope, IActivationExpressionRequest request)
   at Grace.DependencyInjection.Impl.CompiledStrategies.CompiledInitializationDecoratorStrategy`1.InternalGetDecoratorActivationExpression(IInjectionScope scope, IActivationExpressionRequest request)
   at 

... much repeat. 😆

My intent here is to utilize the "built-in" Microsoft.DependencyInjection.Abstractions (AddSingleton, AddTransient, AddScoped, etc) and then use the ConfigureContainer for Grace-specific functionality such as decoration.

FWIW, this approach worked fine when using LightInject, but because it appears that it does some funny business with Func<,> delegates that cannot be turned off, it has forced me to consider alternatives.

Is there a very obvious method call and/or configuration I am overlooking, perhaps?

Thank you for any assistance you can provide and for your efforts into this library. 👍

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions