问题的提出:针对一个接口,有多个实现,我们希望注册这多个实现,在使用时根据实现的类型名称获取具体的实现对象。
在注册时,可以根据类型所在的动态库和名称进行注册:
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;
这样就可以了。
网友评论