【问题标题】:Autofac WEBAPI inserting Controller dependencies through propertiesAutofac WEBAPI通过属性插入Controller依赖
【发布时间】:2014-07-23 22:49:54
【问题描述】:

我有以下 WebAPI 控制器(为简洁起见,我删除了大部分代码)

public class ConnectionController : ApiController
{
    /// <summary>
    /// Gets or sets the connection manager.
    /// </summary>
    /// <value>
    /// The connection manager.
    /// </value>
    public IConnectionManagerService ConnectionManager
    {
        get;
        set;

    }

}

我正在尝试通过 AutoFac 插入 IConnectionManagerService,这是我目前拥有的代码

// Create the container builder.
var builder = new ContainerBuilder();

// Register the Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

// Register other dependencies.
builder.Register(c => new ConnectionManagerService()).As<IConnectionManagerService>().InstancePerRequest();                      

// Build the container.
var container = builder.Build();

// Create the depenedency resolver.
var resolver = new AutofacWebApiDependencyResolver(container);

// Configure Web API with the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver = resolver;

现在在控制器内部,当我尝试使用 ConnectionManager 时,我得到空值。我以为 Autofac 会自动包含依赖项?我不想通过控制器中的构造函数参数包含这种依赖关系。

【问题讨论】:

  • 除了你不想这样做之外,还有其他具体的理由不让你进行构造函数注入吗?
  • 不是真的,我只是想尽可能地坚持开箱即用的标准,而不是进行修改以支持 DI。
  • 使用构造函数注入被认为是最佳实践。不要误导 Visual Studio 默认生成的代码。默认的 VS 模板通常不会传达最佳实践。
  • 要使用构造函数注入,是否需要对Controller进行任何机会,我实际上确实尝试过构造函数注入,但它甚至没有实例化构造函数,我确定我在这里遗漏了一些东西。

标签: asp.net-web-api dependency-injection autofac


【解决方案1】:

要在 Autofac 中实现属性注入,您应该只使用 PropertiesAutowired 扩展方法。在您的 autofac 配置中,行后:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

插入行:

builder.RegisterType<ConnectionController>().PropertiesAutowired();

然后,如果某些内容在您的容器构建器中注册为 IConnectionManagerService,它将被分配给 ConnectionManager 属性。

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多