3

我想将 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>();

我想知道这两个版本有什么区别,请。

4

1 回答 1

2

propertyAssemblyAssembly.LoadFile, 返回相同的 type System.Reflection.Assembly,所以理论上它们应该是相同的,对吧?

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

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

在此处查看此帖子以获取有关差异的一些解释

Assembly.LoadFrom 采用程序集的完整路径,如果您调用此方法,它会将程序集加载到应用程序域中,前提是它尚未通过此方法或任何其他方法从同一路径加载。

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

于 2019-12-16T10:39:37.657 回答