【问题标题】:Autofac Resolve by name only?Autofac 仅按名称解析?
【发布时间】:2012-08-13 22:00:23
【问题描述】:

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

我想做:

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

不是

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

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

谢谢!

【问题讨论】:

  • 这没有意义,除非你想让它返回object。
  • 实际上,这很好用,因为无论如何我都在 Xaml 绑定环境中。实际上,它是一个与 Caliburn 相关的小型集成块,如果这有助于提供更大的上下文。 Caliburn 的 Bind 类有一个方法,该方法尝试仅通过名称而不是类型从所选 IoC 容器中解析。
  • 特别是:Bind.ModelChanged(...) 是有问题的方法。它尝试使用以下行通过 IoC 容器进行检索: target = IoC.GetInstance(null, containerKey);因此,Caliburn 假设提供的 IoC 风格将支持以这种方式检索。不确定 Autofac 是否能够以这种方式工作。 (IoC 只是 Caliburn 源代码中的一个外观类,它抽象出任何容器的细节......)

标签: autofac caliburn.micro


【解决方案1】:

您必须指定 Type 来解析 Autofac 中的服务,通过通用参数或 Type 参数。两种选择:

  1. 通过.Named&lt;object&gt;("service name") 注册您的所有相关服务和其他服务。
  2. 维护自己的Dictionary&lt;string, Type&gt;,以便在通过 Autofac 解析之前自己查找类型。

假设您可以控制所有注册码,我可能会选择选项 1。

【讨论】:

    【解决方案2】:

    这就是我解决问题的方法:

        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();
        }
    

    显然,这不是一个完美的解决方案,因为可以想象可能会有多个注册使用相同的密钥。

    【讨论】:

      【解决方案3】:

      如果您在服务之间保持键的唯一性,此扩展方法将有所帮助:

          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>());
          }
      

      如果没有找到key,它将返回null。

      【讨论】:

        猜你喜欢
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多