属性 使用 RegisterApiControllers 扩展方法时注入不起作用
Property Injection does not work when using RegisterApiControllers extension method
考虑我的简单控制器 class,我想在其中使用记录器(在这种情况下,ILogger 来自 Castle)。
[RoutePrefix("api/orders")]
public class SignalController : ApiController
{
public ILogger Logger { get; set; } = new NullLogger();
// POST api/orders/update
[HttpPost, Route("update")]
public virtual void UpdateHandler(ChangeStateDto update)
{
this.Logger.Info($"Received ChangeStateDto with status {update.Status}");
}
}
然后我有一个自托管的虚拟主机,看起来像这样。
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<>
而不是.RegisterApiControllers
解决了
所以下面的工作按预期进行。但是我仍然不明白为什么我的第一种方法不起作用。
var builder = new ContainerBuilder();
builder.RegisterType<SignalController>()
.WithProperty("Logger", webHostLogger)
.InstancePerRequest();
var container = builder.Build();
它可能没有工作,因为它没有注册任何控制器。
在你的代码中你有:
builder
.RegisterApiControllers()
.WithProperty("Logger", webHostLogger);
但是,您必须告诉注册扩展程序您的控制器在哪些程序集中。You can see that in the examples shown in the docs.
尝试:
builder
.RegisterApiControllers(Assembly.GetExecutingAssembly())
.WithProperty("Logger", webHostLogger);
考虑我的简单控制器 class,我想在其中使用记录器(在这种情况下,ILogger 来自 Castle)。
[RoutePrefix("api/orders")]
public class SignalController : ApiController
{
public ILogger Logger { get; set; } = new NullLogger();
// POST api/orders/update
[HttpPost, Route("update")]
public virtual void UpdateHandler(ChangeStateDto update)
{
this.Logger.Info($"Received ChangeStateDto with status {update.Status}");
}
}
然后我有一个自托管的虚拟主机,看起来像这样。
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<>
而不是.RegisterApiControllers
所以下面的工作按预期进行。但是我仍然不明白为什么我的第一种方法不起作用。
var builder = new ContainerBuilder();
builder.RegisterType<SignalController>()
.WithProperty("Logger", webHostLogger)
.InstancePerRequest();
var container = builder.Build();
它可能没有工作,因为它没有注册任何控制器。
在你的代码中你有:
builder
.RegisterApiControllers()
.WithProperty("Logger", webHostLogger);
但是,您必须告诉注册扩展程序您的控制器在哪些程序集中。You can see that in the examples shown in the docs.
尝试:
builder
.RegisterApiControllers(Assembly.GetExecutingAssembly())
.WithProperty("Logger", webHostLogger);