C# 自动传真和密钥注册-正确的行为?

C# 自动传真和密钥注册-正确的行为?,c#,autofac,C#,Autofac,这个问题相当基本,我刚开始使用Autofac,遇到了Autofac无法正常工作的问题。 鉴于“这就是它的工作方式”,我想理解这种行为背后的逻辑。 下面是非常基本的代码: public interface X { } internal class A : X { } class Program { static void Main(string[] args) { var builder = new ContainerBuilder(); bui

这个问题相当基本,我刚开始使用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;
        }
    }
}
公共接口X{}
内部类A:X{}
班级计划
{
静态void Main(字符串[]参数)
{
var builder=new ContainerBuilder();
builder.RegisterType().Keyed(“A”);
ILifetimeScope scope=builder.Build();
尝试
{
var instance=scope.Resolve();
}
捕获(例外e)
{
控制台写入线(e);
投掷;
}
}
}
尝试解析将导致错误(异常)。 但是为什么呢? 事实上,我并没有要求解决具体的键控、呼叫问题

var instance = scope.ResolveKeyed<X>("A");
var instance=scope.resolvedkeyed(“A”);
将按预期工作和解决,以及如果我注册

builder.RegisterType<A>().Keyed<X>("A").As<X>();
builder.RegisterType().Keyed(“A”).As();
但是,如果我没有要求特定的键控,为什么不解决任何问题呢? 我的意思是,我期望的逻辑是-我要求具体-解决具体,如果我没有要求具体-解决任何/上次注册


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

注册为密钥服务的服务只能使用该密钥解析。如果要在不使用密钥的情况下解析服务,则必须使用
.As()
在不使用密钥的情况下注册服务。如果希望使用密钥或默认情况下解析组件,请向这两者注册组件


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

是的,我理解,问题是“为什么”,这种方法背后的逻辑或思想是什么。因此,您可以拥有没有密钥就无法解析的密钥服务,也可以拥有没有密钥就可以解析的密钥服务,这取决于您如何配置<代码>键控根据定义,服务需要一个键<代码>作为(无眼)服务不可用。这是因为API就是这样设计的。您可以根据需要设置您的服务。我们这里有键控服务,我们不希望在没有键的情况下解析。你看,我问的原因是我有3个接口,用不同的键注册,一个没有键,我希望在IIndex中获得所有接口,然后我用字符串注册获得所有命名/键控,但我不会在没有名字的情况下使用(IIndex x)之类的东西完成注册,然后x[null]或x[string.Empty]会导致错误(异常)。这里的原因可能很简单-理论上,您可以拥有多个非键控服务,因此IIndex无法解析您想要的服务,但这仍然不能解决我的问题:)根据文档,
IIndex
只解析键控服务。如果希望通过索引解析未知服务,则必须给它一个键。仅使用
As
注册的服务根本没有密钥,无论是null、空还是其他。您可以使用名为的
和名为
注册服务。这是一种选择加入的方式。如果你想键入,你必须选择键入。这样做并不会自动选择你加入一个不知名的服务。你必须单独选择。可以说,这比选择退出协议要好:如果我注册了一个键控服务,我不想让它不被激活,那么调用(例如)
.keyed(“name”)。但是notunkeyed()
看起来很奇怪。选择加入所有注册更为自然。