Autofac和Keyed注册 - 正确的行为?

时间:2017-07-28 15:24:31

标签: c# autofac

问题是相当基本的,我刚刚开始使用Autofac并遇到了一个问题,即Autofac不起作用,因为我预期它可以工作。 因此,鉴于“这就是它的工作方式”,我想了解这种行为背后的逻辑。 这是非常基本的代码:

public interface X { }

internal class A : X { }

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<A>().Keyed<X>("A");
        ILifetimeScope scope = builder.Build();

        try
        {
            var instance = scope.Resolve<X>();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }
}

尝试解决会导致错误(异常)。 但为什么 ? 事实上,我没有要求解决具体的Keyed,呼叫

var instance = scope.ResolveKeyed<X>("A");

将按预期工作和解决,以及如果我注册

builder.RegisterType<A>().Keyed<X>("A").As<X>();

但是如果我没有要求特定键入,为什么不解决? 我的意思是我期望的逻辑 - 我要求具体 - 解决具体问题,如果我没有要求具体 - 解决任何/最后注册。

那么为什么选择此行为作为默认行为。

1 个答案:

答案 0 :(得分:1)

注册为键控服务的服务只能使用该密钥进行解析。如果要在不使用密钥的情况下解析服务,则必须使用.As<...>()进行注册而不使用密钥。如果您希望使用密钥或默认情况下解决组件,请注册组件。

使用类比,你可以有一个带有两种把手的门:一把带锁,一把没有。如果要打开钥匙门,则需要提供钥匙。没有锁的门显然不需要钥匙。