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

问题描述 投票:0回答:1

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

以下代码:

    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>();

我想知道两个版本之间有什么区别。

c# inversion-of-control reflect
1个回答
0
投票

属性AssemblyAssembly.LoadFile都返回相同的类型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

© www.soinside.com 2019 - 2024. All rights reserved.