2

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

我想要做:

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

不是

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

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

谢谢!

4

3 回答 3

1

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

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

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

于 2012-08-14T14:58:06.443 回答
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();
    }

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

于 2012-08-14T03:00:13.090 回答
0

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

    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。

于 2017-08-28T13:16:03.527 回答