Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用RegisterApicController扩展方法时,属性注入不起作用_C#_Owin_Autofac_Webapi - Fatal编程技术网

C# 使用RegisterApicController扩展方法时,属性注入不起作用

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

考虑我的简单控制器类,我想在其中使用一个记录器(在本例中,ILogger来自Castle)

然后我有一个自我托管的网络主机,看起来像这样

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用于回复。但是为什么控制器被实例化并可用呢?很可能回到了无参数构造函数。这解决了问题吗?如果是的话,可以接受吗?谢谢回复。但是为什么控制器被实例化并可用呢?很可能回到了无参数构造函数。这解决了问题吗?如果是,可否接受这个答案?