Autofac仅按名称解析?

时间:2012-08-13 22:00:23

标签: autofac caliburn.micro

Autofac是否仅通过名称支持服务解析?或者我必须始终指定服务类型吗?

我想这样做:

container.ResolveNamed("Plugin"); // or container.TryResolvedNamed("Plugin", out instance);

container.ResolvedNamed<ISomeInterface>("Plugin"); // etc

其中“插件”是注册名称/密钥,而不是类型。

谢谢!

3 个答案:

答案 0 :(得分:1)

您必须指定Type才能通过通用参数或Type参数解析Autofac中的服务。两个选项:

  1. 使用其他.Named<object>("service name")注册所有相关服务。
  2. 维护您自己的Dictionary<string, Type>,以便您可以在通过Autofac解析之前自行查找该类型。
  3. 我可能会选择选项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。