自动FAC命名注册失败
本文关键字:注册 失败 FAC 自动 | 更新日期: 2023-09-27 18:34:15
我正在尝试使用命名注册和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();
当我尝试解决时,我收到以下异常:
var myImpl = c.Resolve<IMyInterface>();
Autofac 中发生了类型为"Autofac.Core.Registration.ComponentNotRegisterException"的异常.dll但未在用户代码中处理
其他信息:请求的服务 'MyNameSpace.IMyInterface' 没有 已注册。若要避免此异常,请注册组件 要提供服务,请使用 检查服务注册 IsRegister((,或使用 ResolveOptional(( 方法解析 可选依赖项。
有人知道为什么这会失败吗?内部函数解析确实正常工作,所以事实并非如此!
谢谢尼尔
也许我不明白这个问题,但我认为你做错了。应该使用 RegisterNamed 来获取字符串标签的实现。
在您的示例中,您有:
builder.RegisterType<AImpl>().Named<IMyInterface>("all");
builder.RegisterType<BImpl>().Named<IMyInterface>("all");
这对我来说没有意义。你应该这样称呼:
builder.RegisterType<AImpl>().Named<IMyInterface>("TheNameIsA");
builder.RegisterType<BImpl>().Named<IMyInterface>("TheNameIsB");
而且,在消费类中,您可以在构造函数中要求:
public MyComponent(IIndex<string, IMyInterface> myInterfaceIndex)
...
并要求它提供您想要的组件:
var a = myInterfaceIndex["TheNameIsA"];
var b = myInterfaceIndex["TheNameIsB"];
或者,您可以要求(通过构造函数或属性注入(ILifetimeScope,并将其用于动态解析,如下所示:
var a = myLifetimeScope.ResolveNamed<IMyInterface>("TheNameIsA");
注意,与问题无关:显然,如果您确实需要同时提供多个实现,则可以这样做。如果只需要两者之一,则应使用模块并对其进行配置,以便它仅注册两个实现中的一个。
编辑:您得到的异常是(应该是(,因为您没有调用 ResolveNamed。您正在请求一个 IMyInterface,但您没有注册没有名称的 IMyInterface。所以你得到了例外。我不是100%有信心,但我敢说我对此很有信心。