Autofac是否仅通过名称支持服务解析?或者我必须始终指定服务类型吗?
我想这样做:
container.ResolveNamed("Plugin"); // or container.TryResolvedNamed("Plugin", out instance);
不
container.ResolvedNamed<ISomeInterface>("Plugin"); // etc
其中“插件”是注册名称/密钥,而不是类型。
谢谢!
答案 0 :(得分:1)
您必须指定Type
才能通过通用参数或Type
参数解析Autofac中的服务。两个选项:
.Named<object>("service name")
注册所有相关服务。Dictionary<string, Type>
,以便您可以在通过Autofac解析之前自行查找该类型。我可能会选择选项1,假设您可以控制所有注册码。
答案 1 :(得分:0)
这就是我解决问题的方法:
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();
}
显然,这不是一个完美的解决方案,因为可以想象可以使用相同的密钥进行多次注册。
答案 2 :(得分:0)
如果您在服务中保持密钥的唯一性,则此扩展方法将有所帮助:
{{1}}
如果找不到密钥,它将返回null。