泛型的动态依赖注入 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".
我是 .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".