C# 使用RegisterApicController扩展方法时,属性注入不起作用
考虑我的简单控制器类,我想在其中使用一个记录器(在本例中,ILogger来自Castle) 然后我有一个自我托管的网络主机,看起来像这样C# 使用RegisterApicController扩展方法时,属性注入不起作用,c#,owin,autofac,webapi,C#,Owin,Autofac,Webapi,考虑我的简单控制器类,我想在其中使用一个记录器(在本例中,ILogger来自Castle) 然后我有一个自我托管的网络主机,看起来像这样 public class WebHost { private readonly string url; private IDisposable disposable; private readonly ILifetimeScope scope; public WebHost(string url, ILifetimeScope
public class WebHost
{
private readonly string url;
private IDisposable disposable;
private readonly ILifetimeScope scope;
public WebHost(string url, ILifetimeScope scope)
{
this.url = url;
this.scope = scope;
}
public ILogger Logger { get; set; } = new NullLogger();
// ...
public void Start()
{
try
{
this.Logger.Info($"Starting web host at {url}");
this.disposable = WebApp.Start(this.url, app =>
{
var config = new HttpConfiguration
{
DependencyResolver = new AutofacWebApiDependencyResolver(scope)
};
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
});
// ...
}
catch (Exception e)
{
// ...
this.Logger.Error(e.Message, e);
}
}
}
这是呼叫类型
public class SomeCallerClass
{
public SomeCallerClass()
{
var webHostLogger = new SomeILoggerImplementation(this, "WebHost");
var builder = new ContainerBuilder();
builder.RegisterApiControllers()
.WithProperty("Logger", webHostLogger);
var container = builder.Build();
this.webHost = new WebHost("http://localhost:9000", container)
{
Logger = webHostLogger
};
}
}
现在我遇到的问题是属性注入不适用于我的SignalController
类型。它始终保存对NullLogger
实例的引用。我就是不明白为什么。我用.RegisterType
而不是.registerapicontroller
解决了这个问题
因此,下面的工作正如预期的那样。然而,我仍然不明白为什么我的第一种方法不起作用
var builder = new ContainerBuilder();
builder.RegisterType<SignalController>()
.WithProperty("Logger", webHostLogger)
.InstancePerRequest();
var container = builder.Build();
var builder=newcontainerbuilder();
builder.RegisterType()
.WithProperty(“记录器”,webHostLogger)
.InstancePerRequest();
var container=builder.Build();
我用.RegisterType
而不是.registerapicontroller
解决了这个问题
因此,下面的工作正如预期的那样。然而,我仍然不明白为什么我的第一种方法不起作用
var builder = new ContainerBuilder();
builder.RegisterType<SignalController>()
.WithProperty("Logger", webHostLogger)
.InstancePerRequest();
var container = builder.Build();
var builder=newcontainerbuilder();
builder.RegisterType()
.WithProperty(“记录器”,webHostLogger)
.InstancePerRequest();
var container=builder.Build();
它可能不工作,因为它没有注册任何控制器
在代码中,您有:
builder
.RegisterApiControllers()
.WithProperty(“记录器”,webHostLogger);
但是,您必须告诉注册扩展插件控制器所在的程序集
尝试:
builder
.RegisterApicController(Assembly.getExecutionGassembly())
.WithProperty(“记录器”,webHostLogger);
它可能不工作,因为它没有注册任何控制器
在代码中,您有:
builder
.RegisterApiControllers()
.WithProperty(“记录器”,webHostLogger);
但是,您必须告诉注册扩展插件控制器所在的程序集
尝试:
builder
.RegisterApicController(Assembly.getExecutionGassembly())
.WithProperty(“记录器”,webHostLogger);
Thx用于回复。但是为什么控制器被实例化并可用呢?很可能回到了无参数构造函数。这解决了问题吗?如果是的话,可以接受吗?谢谢回复。但是为什么控制器被实例化并可用呢?很可能回到了无参数构造函数。这解决了问题吗?如果是,可否接受这个答案?