(注意:这是一个简化的例子,旨在突出我所看到的问题。)
我有一项服务我尝试注册为命名服务,如下所示:
builder.Register(new MyService()).Named<IMyService>("Test").SingleInstance();
我原本希望能够在我的API控制器的构造函数中使用此服务:
public TestController([WithKey("Test")] IMyService myService)
{
}
然而,抛出异常:
None of the constructors found with
'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type
'TestController' can be invoked with the available services and parameters:
Cannot resolve parameter 'IMyService myService' of constructor 'Void
.ctor(IMyService)'.
当我用.As()替换.Named()调用时,上面的代码相同:
builder.Register(new MyService()).As<IMyService>().SingleInstance();
public TestController(IMyService myService)
{
}
似乎在我保持.Named()调用时工作,但首先添加 .As()调用:
builder.Register(new MyService()).As<IMyService>().Named<IMyService>("Test")
.SingleInstance();
public TestController([WithKey("Test")] IMyService myService)
{
}
有关为什么会这样做的任何想法?我如何注册命名服务?
答案 0 :(得分:0)
该组件将要求您注册具有指定名称的键控服务。您还需要使用过滤器注册组件,以便容器知道要查找它。
var builder = new ContainerBuilder();
// Register the keyed service to consume
builder.RegisterType<MyArtwork>().Keyed<IArtwork>("Painting");
// Specify WithAttributeFilter for the consumer
builder.RegisterType<ArtDisplay>().As<IDisplay>().WithAttributeFilter();
...
var container = builder.Build();
注意WithAttributeFilter()
。尝试将此添加到RegisterControllers()
来电。
答案 1 :(得分:0)
您需要使用[WithName]属性而不是[WithKey]