问题是相当基本的,我刚刚开始使用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>();
但是如果我没有要求特定键入,为什么不解决? 我的意思是我期望的逻辑 - 我要求具体 - 解决具体问题,如果我没有要求具体 - 解决任何/最后注册。
那么为什么选择此行为作为默认行为。
答案 0 :(得分:1)
注册为键控服务的服务只能使用该密钥进行解析。如果要在不使用密钥的情况下解析服务,则必须使用.As<...>()
进行注册而不使用密钥。如果您希望使用密钥或默认情况下解决组件,请注册组件。
使用类比,你可以有一个带有两种把手的门:一把带锁,一把没有。如果要打开钥匙门,则需要提供钥匙。没有锁的门显然不需要钥匙。