我想将类从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>();
我想知道两个版本之间有什么区别。
属性Assembly
和Assembly.LoadFile
都返回相同的类型System.Reflection.Assembly
,所以理论上它们应该相同,对吧?
事实是您在这些情况下不应该使用LoadFile
。尝试执行以下操作:
//Version_2 with LoadFrom
var filePath = Directory.GetFiles(Directory.GetCurrentDirectory(), Constants.DataAccess_Dll).FirstOrDefault();
var assembly = Assembly.LoadFrom(filePath);