泛型的动态依赖注入 class

Dynamic dependency injection of a generic class

我是 .Net 世界的新手,我遇到了一个我找不到解决方案的问题,我希望你能帮助我。

我有一个实现通用接口的通用 class,当我实现依赖项注入时,我不知道如何使其动态化。

例如:

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

我有多个 classes 我想传递给通用 class/interface(Game 是其中之一)并且我知道我有为其中的每一个重复这一行,但我想知道有什么方法可以使它动态化。

谢谢。

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

// 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" 是模型所在的完整命名空间。

您要找的是 "open generic" 注册。您没有确切说明您使用的是什么 DI 框架,但对于大多数 DI 框架,语法类似于:

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

我猜你正在使用 Microsoft DI 框架。如果是这样,相关文档是here。搜索单词 "generic".