【问题标题】:Dynamic dependency injection of a generic class泛型类的动态依赖注入
【发布时间】:2020-03-25 09:41:09
【问题描述】:

我对 .Net 世界还很陌生,遇到了一个我找不到解决方案的问题,希望您能帮我解决。

我有一个实现泛型接口的泛型类,当我实现依赖注入时,我不知道如何使它成为动态的。

例如:

services.AddSingleton<IGenericRepository<Game>, GenericRepository<Game>>();

我有多个要传递给通用类/接口的类(Game 就是其中之一),我知道我必须为它们中的每一个重复这一行,但我想知道有什么方法可以使这种动态变化。

谢谢。

【问题讨论】:

    标签: c# generics asp.net-core dependency-injection inversion-of-control


    【解决方案1】:

    您要查找的内容称为“开放通用”注册。您没有确切说明您使用的是什么 DI 框架,但对于大多数 DI 框架,语法类似于:

    services.AddSingleton(typeof(IGenericRepository<>), typeof(GenericRepository<>));
    

    我的猜测是您使用的是 Microsoft DI 框架。如果是,相关文档为here。搜索“通用”一词。

    【讨论】:

    • 哇,不知怎的,我完全不了解这个。失败。这绝对是 OP 正在寻找的,而不是我严重过度设计的答案...... :)
    • 谢谢,这正是我想要的。
    【解决方案2】:

    如果它们都在同一个命名空间中,您可能会使用反射来加载所有模型类型。比如:

    // You can use Assembly.GetExecutingAssembly() if the models are in the same assembly this code runs from
    var assembly = typeof(SomeTypeInAssembly).Assembly;
    
    var modelTypes = assembly.GetTypes()
        .Where(t => t.IsClass && t.Namespace == "Namespace.For.Your.Models");
    
    foreach (var modelType in modelTypes)
    {
        services.AddScoped<IGenericRepository<modelType>, GenericRepository<modelType>>();
    }
    

    SomeTypeInAssembly 是模型所在的同一程序集中的类型,"Namespace.For.Your.Models" 是模型所在的完整命名空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多