属性 使用 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);