反射程序集使用services.AddScoped()和services.AddScoped<T>()注入DI的问题

毕设工坊 其他问答 1

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 (); 3、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中,不想写太多的注册代码

回复

共1条回复 我来回复
  • 源码项目助手
    这个人很懒,什么都没有留下~
    评论
    1. services.AddScoped(service);//项目不可正常启动 这样注入是成功的,你放心.
    2. 使用的方法不对, 试试看这样: serviceProvider.getservice(service)// 这里的service和你在注入DI的是同一个type对象, 就是这个 var service = types[m];.

    你先硬编码测试一下.

    0条评论

发表回复

登录后才能评论