Autofac 是否支持仅通过名称解析服务?还是我必须始终指定服务类型?
我想要做:
container.ResolveNamed("Plugin"); // or container.TryResolvedNamed("Plugin", out instance);
不是
container.ResolvedNamed<ISomeInterface>("Plugin"); // etc
其中“插件”将是注册名称/密钥,而不是类型。
谢谢!
Autofac 是否支持仅通过名称解析服务?还是我必须始终指定服务类型?
我想要做:
container.ResolveNamed("Plugin"); // or container.TryResolvedNamed("Plugin", out instance);
不是
container.ResolvedNamed<ISomeInterface>("Plugin"); // etc
其中“插件”将是注册名称/密钥,而不是类型。
谢谢!
您必须Type
通过通用参数或Type
参数指定 a 来解析 Autofac 中的服务。两种选择:
.Named<object>("service name")
。Dictionary<string, Type>
,以便在通过 Autofac 解析之前自己查找类型。假设您可以控制所有注册码,我可能会选择选项 1。
这就是我解决问题的方法:
private Type GetTypeForName(string key)
{
return (
from reg in Container.ComponentRegistry.Registrations
from service in reg.Target.Services.OfType<KeyedService>()
.Where(service => service.ServiceKey.ToString() == key)
select service.ServiceType).FirstOrDefault();
}
显然,这不是一个完美的解决方案,因为可以想象可能有多个注册具有相同的密钥。
如果您保持服务之间键的唯一性,此扩展方法将有助于:
private static object ResolveSingleOrDefaultByName(this IComponentContext cc, string name)
{
var reg = cc.ComponentRegistry.Registrations.SingleOrDefault(r =>
r.Services.OfType<KeyedService>().Any(s => name.Equals(s.ServiceKey)));
return reg == null ? null : cc.ResolveComponent(reg, Enumerable.Empty<Parameter>());
}
如果未找到密钥,它将返回 null。