自动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(( 方法解析 可选依赖项。

有人知道为什么这会失败吗?内部函数解析确实正常工作,所以事实并非如此!

谢谢尼尔

自动FAC命名注册失败

也许我不明白这个问题,但我认为你做错了。应该使用 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%有信心,但我敢说我对此很有信心。