C# Autofac命名注册失败

C# Autofac命名注册失败,c#,autofac,C#,Autofac,我正在尝试使用命名注册和func来注册我需要的实现 builder .RegisterType<AImpl>().Named<IMyInterface>("all"); builder .RegisterType<BImpl>().Named<IMyInterface>("all"); builder .Register(c =>

我正在尝试使用命名注册和func来注册我需要的实现

 builder
       .RegisterType<AImpl>().Named<IMyInterface>("all");

        builder
       .RegisterType<BImpl>().Named<IMyInterface>("all");

        builder
            .Register(c =>
            {
                var myImpl= c.ResolveNamed<IEnumerable<IMyInterface>>("all").FirstOrDefault(a => a.Code == "SOMESTRING");
                if (myImpl== null)
                    throw new MySpecificException("SOMESTRING");
                return myImpl;
            })
            .AsImplementedInterfaces();
builder
.RegisterType().Named(“全部”);
建设者
.RegisterType().Named(“全部”);
建设者
.寄存器(c=>
{
var myImpl=c.ResolveNamed(“all”).FirstOrDefault(a=>a.Code==“SOMESTRING”);
if(myImpl==null)
抛出新的mySpecificeException(“SOMESTRING”);
返回myImpl;
})
.a实现接口();
尝试解决时,我遇到以下异常:

        var myImpl = c.Resolve<IMyInterface>();
var myImpl=c.Resolve();
Autofac.dll中出现类型为“Autofac.Core.Registration.ComponentNotRegisteredException”的异常,但未在用户代码中处理

附加信息:请求的服务 “MyNameSpace.IMyInterface”尚未启动 我已经登记了。要避免此异常,请注册一个组件 要提供服务,请使用检查服务注册 IsRegistered(),或使用ResolveOptional()方法解析 可选依赖项

有人知道为什么会失败吗?内部函数解析为正确工作,因此不是这样

谢谢
尼尔

也许我不明白这个问题,但我认为你做错了。应该使用RegisterNamed,以便通过字符串标记获得实现

在您的示例中,您有:

builder.RegisterType<AImpl>().Named<IMyInterface>("all");
builder.RegisterType<BImpl>().Named<IMyInterface>("all");
或者,您可以要求(通过构造函数或属性注入)ILifetimeScope,并将其用于动态解析,如下所示:

var a = myLifetimeScope.ResolveNamed<IMyInterface>("TheNameIsA");
var a=myLifetimeScope.ResolveNamed(“TheNameIsA”);
注意,与问题无关: 显然,如果您真的需要同时提供多个实现,那么这一点很明显。 如果您只需要两个实现中的一个,那么应该使用一个模块并对其进行配置,以便它只注册两个实现中的一个

编辑: 您得到的异常是(应该是),因为您没有调用ResolveNamed。您正在请求IMyInterface,但您没有注册没有名称的IMyInterface。所以你得到了例外。我不是百分之百有信心,但我敢说我对此很有信心

public MyComponent(IIndex<string, IMyInterface> myInterfaceIndex)
...
var a = myInterfaceIndex["TheNameIsA"];
var b = myInterfaceIndex["TheNameIsB"];
var a = myLifetimeScope.ResolveNamed<IMyInterface>("TheNameIsA");