Skip to content

Resolving types registered through assembly scanning is not possible anymore #218

@ArnaudB88

Description

@ArnaudB88

Hi,

In our solution we registers all dependencies with assembly scanning.
This results in thousands of registrations with a service name.

In LightInject.MS.DI v3.6.3, it was possible to resolve a type without specifying a service name.
But in the latest version, that is not possible anymore.

We use the CQRS pattern using MediatR, and sending a command through mediatR fails with all v4.x versions:

Unable to resolve type: MediatR.IRequestHandler`2[ClientX.ProjectY.Queries.WarmupApplication,ClientX.ProjectY.Dtos.SuccessOrFailureDto], service name: 

System.InvalidOperationException:
   at LightInject.ServiceContainer.CreateDelegate (LightInject, Version=7.0.1.0, Culture=neutral, PublicKeyToken=null)
   at LightInject.ServiceContainer.CreateDefaultDelegate (LightInject, Version=7.0.1.0, Culture=neutral, PublicKeyToken=null)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)
   at MediatR.Wrappers.RequestHandlerWrapperImpl`2+<>c__DisplayClass1_0.<Handle>g__Handler|0 (MediatR, Version=12.0.0.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2)
   at MediatR.Mediator.Send (MediatR, Version=12.0.0.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2)

I created a unit test to illustratie the bug.
The following code works in LightInject.MS.DI v3.6.3 and doesn't work in v4.x:

//Options: like an ASP.NET Core application
var options = ContainerOptions.Default.Clone().WithMicrosoftSettings().WithAspNetCoreSettings();
var container = new ServiceContainer(options);
container.ConstructorDependencySelector = new AnnotatedConstructorDependencySelector();
container.ConstructorSelector = new AnnotatedConstructorSelector(container.CanGetInstance);

container.RegisterAssembly(typeof(TestClass).Assembly);

var resolveNamed = container.TryGetInstance<TestClass>("LightInject.Microsoft.DependencyInjection.Tests.TestClass");
var resolveUnnamed = container.TryGetInstance<TestClass>();

Assert.NotNull(resolveNamed);//LightInject.Microsoft.DependencyInjection v3.6.3 -> succeeds
Assert.NotNull(resolveUnnamed);//LightInject.Microsoft.DependencyInjection v3.6.3 -> succeeds

Is it possible to make a fix, which also returns an instance for resolving an instance without specifying a name?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions