2017-07-28 55 views
-1

问题是相当基本的,我刚开始使用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; 
     } 
    } 
} 

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

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

将工作和解决象预期的那样好,如果我注册

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

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

那么为什么这种行为被选为默认值。

回答

1

注册为密钥服务的服务只能使用该密钥解析。如果您想在不使用密钥的情况下解决服务问题,则必须使用.As<...>()注册一个服务。如果您希望他们使用密钥解析或默认解决方案,请将您的组件注册到两者。

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

+0

是的,我明白,问题是“为什么”,这种方法背后的逻辑或意识形态。 – TheLordkiron

+0

因此,您可以拥有无​​法解密的密钥服务,而且您也可以拥有无​​需密钥即可解析的密钥服务,由您决定如何配置它。根据定义,“键控”服务需要密钥。 '作为'(无键)服务不。就是这样,因为这就是API的设计。不管你想要什么,你都可以设置你的服务。我们在这里拥有密钥服务,我们不*不希望在没有密钥的情况下解析。 – Amy

+0

你看我之所以问的原因是我有3个接口,用不同的密钥注册键和一个没有密钥注册的场景,我希望在IIndex 中得到所有这些,然后我得到所有命名/键入字符串注册,但我没有得到注册完成没有名称,使用类似(我索引 x),然后x [null]或x [string.Empty]导致错误(例外)。这里的原因可能是微不足道的 - 理论上你可能有更多的非键控,所以IIndex无法解决你想要的,但这仍然不能解决我的问题:) – TheLordkiron