我正在try 在我的. Net 8应用程序中设置依赖注入,并希望它根据命名约定进行扫描和注册. 我遇到的问题是,我不知道如何注册IFoo<in T1, out T2>个人创建的实现来设置对象的自定义映射.具体的实现继承自IFoo的接口.

以下是目前为止我的DI代码:

public static void ConfigureServices(IServiceCollection services, Assembly assembly)
{
    var types = assembly.GetTypes()
        .Where(t => t.GetInterfaces().Any(i => i.IsGenericType)).ToList();

    foreach (var type in types)
    {
        var interfaces = type.GetInterfaces();

        foreach (var @interface in interfaces)
        {
            // Register the interface mapping to the type in DI container
            services.AddTransient(@interface, type);

            // Register a factory for the Funcs
            services.AddTransient(typeof(Func<>).MakeGenericType(@interface),
                provider => new Func<object>(() => provider.GetService(@interface)));
        }
    }
}

下面是一个如何设置类的示例:

 public interface ISpecificFoo : IFoo<Member, SpecificFoo.Output>
 {
 }

 public class SpecificFoo : ISpecificFoo 
 {
     public class Output
     {
     }
 }

到目前为止,我得到的错误是:

System. ArgumentException:'无法实例化实现类型 "ISpecificFoo" 的针对服务类型 'IFoo'2

推荐答案

您没有过滤掉接口类型,所以如果您有任何扩展为IFoo<in T1, out T2>的接口(就像ISpecificFoo一样),那么它将被错误地注册为实现类型.

你可以这样做:

var types = assembly
    .GetTypes()
    .Where(t => !t.IsAbstract) // Don't consider interfaces (or abstract classes).
    .Where(t => t.GetInterfaces().Any(i => i.IsGenericType))
    .ToList();

现在只有可实例化的类型将被注册,例如SpecificFoo.

为了进一步限制这一点,您可以专门将IFoo<in T1, out T2>作为服务类型:

var interfaces = type
    .GetInterfaces()
    .Where(i =>
        i.IsGenericType &&
        i.GetGenericTypeDefinition() == typeof(IFoo<,>));

Csharp相关问答推荐

无法使用ternal- .net修复可空警告

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

Regex在c#中完全匹配

当打印一行x个项目时,如何打印最后一行项目?

如何将Kafka消息时间戳转换为C#中的日期和时间格式?

可为空的泛型属性

如何定义EFCore中的多个穿透

内部接口和类的DI解析

如何在C#中从正则表达式中匹配一些数字但排除一些常量(也是数字)

Rider将.NET安装在哪里

C#带主体的主构造函数?

在.NET 7.0 API控制器项目中通过继承和显式调用基类使用依赖项注入

VS 2022 for ASP.NET Core中缺少自定义项模板

依赖项注入、工厂方法和处置困境

JsonSchema.Net删除假阳性判断结果

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

C#自定义验证属性未触发IsValid方法

JSON串行化程序问题.SQLite中的空值

为什么Swashbakle/Swagger在参数中包含变量名?

我想我必须手动使用res1(字符串形式的PowerShell哈希表)