C#当我使用reflect注册类时,为什么不能从ioc获得正确的实例
我想将dll中的类注册到IOC,但是当我从IOC中获取实例时,它会返回一个空值。与下面版本2的代码相同。 但是如果我使用版本_1,它将返回一个正确的实例 代码如下:C#当我使用reflect注册类时,为什么不能从ioc获得正确的实例,c#,inversion-of-control,reflect,C#,Inversion Of Control,Reflect,我想将dll中的类注册到IOC,但是当我从IOC中获取实例时,它会返回一个空值。与下面版本2的代码相同。 但是如果我使用版本_1,它将返回一个正确的实例 代码如下: private static void RegistRepository(ServiceCollection services) { //Version_1 //var assembly = typeof(IDataProvider).Assembly; //Vers
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>();
我得到的实例代码如下:
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>();
var服务=配置服务(配置);
var provider=services.BuildServiceProvider();
var configurationService=provider.GetService();
我想知道这两个版本之间有什么区别。属性
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);
检查
Assembly.LoadFrom获取程序集的完整路径,如果您调用此方法,它将将程序集加载到应用程序域中,前提是此方法或任何其他方法未从同一路径加载程序集
LoadFrom将其加载到应用程序域并引用应用程序域的类型。您不需要创建任何实例。第一个版本只处理类型。您的服务似乎是一个具有关联接口类型的类类型列表。