0

我有以下接口:

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

我有一些实现第一个和第二个验证器的服务。

在使用Scrutor之前,我手动注册了服务,一切都按预期工作:

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

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

我可以为我的其他服务注入一个特定的验证器:

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

但是,当我尝试使用 Scrutor 自动注册(以第一个验证器为例)时:

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

注入类型为父验证器(即IValidator),具体实现的注入数组留空。

如何实现自动注册为特定接口作为类型?

4

1 回答 1

2

您必须删除UsingRegistrationStrategythis 定义如何处理重复项,在您的情况下,您需要它的所有实现。

您也可以将其替换为.UsingRegistrationStrategy(RegistrationStrategy.Append)

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

这里有一个.NET Fiddle

于 2021-11-02T11:18:48.630 回答