反射程序集使用services.AddScoped()和services.AddScoped<T>()注入DI的问题
1、使用Assembly.Load加载程序集
//反射注入DI
var path = AppDomain.CurrentDomain.BaseDirectory;
var asses = new List<Assembly>();
var files = Directory.GetFiles(path, "*.dll");
for (int i = 0; i < files.Length; i++)
{
asses.Add(Assembly.Load(File.ReadAllBytes(files[i])));
}
2、循环遍历类,发现符合条件的类使用AddScoped方法注入DI,举例类名为LoginContext
for (int i = 0; i < asses.Count; i++)
{
var modules = asses[i].GetModules();
for (int j = 0; j < modules.Length; j++)
{
var types = modules[j].GetTypes();
for (int m = 0; m < types.Length; m++)
{
var service = types[m];
if (可注入条件)
{
services.AddScoped(service);//项目不可正常启动
services.AddScoped(typeof(LoginContext));//项目正常启动
services.AddScoped<LoginContext>();//项目正常启动
}
}
}
}
3、services内容
4、使用构造函数注入的方式 5、错误信息
只保留services.AddScoped(service);启动项目时会报错: Unable to resolve service for type
不知道错误原因是什么,services.AddScoped()和services.AddScoped
<T>
()的注入效果不应该是一样的吗?
问题补充:
补充问题:
错误:Unable to resolve service for type 'Adam.Application.IService.System.IDemoClass'
1、准备一个测试接口类:IDemoClass和测试实现类:DemoClass
2、IDemoClass与DemoClass在同一个项目中(编译后则在同一个程序集dll),无论其命名空间是否相同
//第一种写法报错
var inj = service.GetInterface("I" + service.Name);
services.AddScoped(inj, service);
//第二种写法不报错
services.AddScoped(typeof(IDemoClass), typeof(DemoClass));
//第三种写法不报错
services.AddScoped
疑惑点: 现在疑惑点转移到第一种写法与第二种写法的问题,为什么会造成这种限制,是我电脑环境(core5.0)的问题,还是代码本身带的这种限制,还是说写法错误
需要第一种写法的原因: 1、我在代码设计中有些注册到DI的类没有接口类 2、我是通过反射的方式将想要注册的类注册到DI中,不想写太多的注册代码
发表回复