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