IServiceCollection根据类型名称获取对象

2021-08-16  本文已影响0人  寻找无名的特质

问题的提出:针对一个接口,有多个实现,我们希望注册这多个实现,在使用时根据实现的类型名称获取具体的实现对象。
在注册时,可以根据类型所在的动态库和名称进行注册:

                var assemblyPath = Path.Combine(basePath, p.AssemblyName);
                if (!assemblyPath.EndsWith(".dll")) assemblyPath += ".dll";
                var typeName = p.ClassName;
                var assembly = Assembly.LoadFrom(assemblyPath);
                var loggerType = assembly.GetType(typeName);
                services.AddScoped(loggerType);

在获取时,可以使用IServiceProvider的GetService获取:

            var p = dbOption.Providers.Find(o => o.ProviderName == providerName);
            var assemblyPath = Path.Combine(contextOption.Basepath, p.AssemblyName);
            if (!assemblyPath.EndsWith(".dll")) assemblyPath += ".dll";
            var typeName = p.ClassName;
            var assembly = Assembly.LoadFrom(assemblyPath);
            var loggerType = assembly.GetType(typeName);
            return provider.GetService(loggerType) as IDataAccess;

这样就可以了。

上一篇 下一篇

猜你喜欢

热点阅读