Register services with child interface type using Scrutor

679 Views Asked by At

I have the following interfaces:

public interface IValidator
{
    Task<Response> Validate(object request);
}
public interface IFirstChildValidator : IValidator
public interface ISecondChildValidator : IValidator

I have some services that implement the first and the second validators.

Before using Scrutor, I registered the services manually, and everything worked as expected:

services.AddScoped<IFirstChildValidator, FirstBar>();
services.AddScoped<IFirstChildValidator, FirstFoo>();

services.AddScoped<ISecondChildValidator, SecondBar>();
services.AddScoped<ISecondChildValidator, SecondFoo>();

and I could inject a specific validator to my other services:

private readonly IEnumerable<IFristValidator> _firstValidators;
// ctor injection

However, when I try to auto-register (the first validator as an example) using Scrutor:

services.Scan(scan => scan
    .FromAssemblyOf<IFirstChildValidator >()
    .AddClasses(classes => classes
        .InNamespaces("my.namespace")
        .AssignableTo<IFirstChildValidator>())
    .UsingRegistrationStrategy(RegistrationStrategy.Replace(ReplacementBehavior.ImplementationType))
.AsImplementedInterfaces()
.WithScopedLifetim();

The injected type is the parent validator (i.e. IValidator), and the injected array of the specific implementation is left empty.

How can I achieve auto-register as specific interfaces as types?

1

There are 1 best solutions below

2
Max On BEST ANSWER

You must remove the UsingRegistrationStrategy this defines how to handle duplicates, in your case you want ALL of its implementations.

You can also replace it with .UsingRegistrationStrategy(RegistrationStrategy.Append)

services.Scan(scan => scan
    .FromAssemblyOf<IFirstChildValidator>()
    .AddClasses(classes => classes
        .InNamespaces("my.namespace")
        .AssignableTo<IFirstChildValidator>())
.AsImplementedInterfaces()
.WithScopedLifetime());

Here a .NET FIddle