Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#当我使用reflect注册类时,为什么不能从ioc获得正确的实例_C#_Inversion Of Control_Reflect - Fatal编程技术网

C#当我使用reflect注册类时,为什么不能从ioc获得正确的实例

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

我想将dll中的类注册到IOC,但是当我从IOC中获取实例时,它会返回一个空值。与下面版本2的代码相同。 但是如果我使用版本_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>();
我得到的实例代码如下:

    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将其加载到应用程序域并引用应用程序域的类型。

您不需要创建任何实例。第一个版本只处理类型。您的服务似乎是一个具有关联接口类型的类类型列表。