当我使用反射注册时,C# 为什么无法从 ioc 获取正确的实例 class

C# Why cannot get the correct instance from ioc, when i use reflect to regist class

我想将 类 从 dll 注册到 IOC,但是当我从 IOC 获取实例时,它 return 给我一个空值。如下面的代码Version_2。 但是如果我使用 Version_1,它将 return 一个正确的实例。

代码如下:

    private static void RegistRepository(ServiceCollection services)
    {
        //Version_1
        //var assembly = typeof(IDataProvider).Assembly;

        //Version_2
        var filePath = Directory.GetFiles(Directory.GetCurrentDirectory(), Constants.DataAccess_Dll).FirstOrDefault();
        var assembly = Assembly.LoadFile(filePath);

        var repositoryList = assembly.GetTypes().Where(x => x.IsClass && x.BaseType.Name == typeof(RepositoryBase).Name).ToList();
        foreach (var repository in repositoryList)
        {
            var interfaceType = repository.GetInterfaces().FirstOrDefault();
            services.AddSingleton(interfaceType, repository);
        }
    }

我得到的实例代码如下:

 var services = ConfigurationService(configuration);
 var provider = services.BuildServiceProvider();
 var configurationService = provider.GetService<IConfigurationRepository>();

请问这两个版本有什么区别

属性AssemblyAssembly.LoadFile、return都是同一个类型System.Reflection.Assembly,所以理论上应该是一样的吧?

事实上,您不应该在这些场合使用 LoadFile。尝试执行以下操作:

    //Version_2 with LoadFrom
    var filePath = Directory.GetFiles(Directory.GetCurrentDirectory(), Constants.DataAccess_Dll).FirstOrDefault();
    var assembly = Assembly.LoadFrom(filePath);

勾选this post here for some explanation on differences

Assembly.LoadFrom takes the full path of the assembly and if you call this method, it will load assembly into the application domain provided it has not been loaded from the same path by this or any of the other methods.

LoadFrom 将其加载到应用程序域中并引用应用程序域的类型。