如何使用反射查找和注册依赖项



我想做以下事情:

想象一下,我有实现接口IValidator的类。我想找到所有这些类,并将它们注册到dotnet核心标准依赖项注入容器中。

示例:

services.AddSingleton<IValidator<Delete.Command>, Delete.CommandValidator>();
services.AddSingleton<IValidator<CreateOrUpdate.Command>, CreateOrUpdate.CommandValidator>();

我知道如何找到课程。

var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));

问题是,我不知道在找到它们后如何注册。

我不知道用什么关键词在网上搜索信息。所以我决定在这里提问。

谢谢!

我找到了它,它看起来像是.NET方法接受类型。你可以删除我的问题,也可以把它留给有同样问题的人。

var interfaceType = typeof(IValidator<Delete.Command>);
var implementationType = typeof(Delete.CommandValidator);
services.AddSingleton(interfaceType, implementationType);

您正在使用哪个IoC容器?提问时应始终指定此项,因为每个IoC容器可能有不同的方法,例如,如果您使用Autofac,则有一个专用方法RegisterAssemblyTypes,不需要手动扫描程序集。无论如何,按照你的例子,这样的东西应该是有效的:

foreach (var type in types)
{
foreach (var iType in type.GetInterfaces())
{
services.AddSingleton(iType, type);
}
}

另一种选择是为每种类型创建实例,然后注册:

var instances = types.Select(t => (IIMyInterface)Activator.CreateInstance(t)).ToList();
foreach(var instance in instances)
services.AddSingleton<IIMyInterface>(instance); 

让我知道它是否有效(我不清楚Delete.CommandValidator和CreateOrUpdate.Command验证器的实现如何(

BTW注意GetAssemblies,因为它只返回加载的程序集。如果需要从不同的项目(具有嵌套引用(获取程序集,则应直接从dll加载程序集。如果是这种情况,请检查:https://github.com/nopSolutions/nopCommerce/blob/develop/src/Libraries/Nop.Core/Infrastructure/AppDomainTypeFinder.cs

最新更新