属性注入失败,使用Autofac

时间:2015-04-09 10:23:13

标签: c# autofac

我正在使用Autofac与MVC / Owin和WebApi。

遵循Autofac文档我正在使用设置:

public static void Run(IAppBuilder application) {

  ContainerBuilder builder = new ContainerBuilder();

  HttpConfiguration configuration = GlobalConfiguration.Configuration;

  builder.RegisterControllers(typeof(MvcApplication).Assembly);
  builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
  builder.RegisterModelBinderProvider();
  builder.RegisterModule<AutofacWebTypesModule>();
  builder.RegisterSource(new ViewRegistrationSource());
  builder.RegisterFilterProvider();
  builder.RegisterApiControllers(typeof(MvcApplication).Assembly);
  builder.RegisterWebApiFilterProvider(configuration);

  builder.RegisterType<Test>().As<ITest>().PropertiesAutowired();        

  IContainer container = builder.Build();
  application.UseAutofacMiddleware(container);
  DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
  configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

}

然后我在控制器上测试了构造函数和属性注入:

public interface ITest { }
public class Test : ITest { }

public partial class HomeController : Controller {

  private ITest _testConstructor { get; set; }
  public ITest TestProperty { get; set; }

  public HomeController(ITest testConstructor) {

    _testConstructor = testConstructor;

  }

  public virtual ActionResult Index() {
    var test = TestProperty;
  }
}

因此注入_testConstructor并且TestProperty始终为null。

我甚至在Index方法中检查了它的值,它是null ...

我尝试了不同的配置,并且在应用程序的不同部分,属性注入总是失败......

有人可以帮我解决这个问题吗?

更新1

添加.PropertiesAutowired();到RegisterController工作的控制器,但不适用于ViewPages。

我正在使用ViewPageBase,如下所示:

public abstract class ViewPageBase : WebViewPage {
  public ITest Test { get; set; }
} // ViewPageBase

public abstract class ViewPageBase<T> : WebViewPage<T> {
  public ITest Test { get; set; }
} // ViewPageBase

然后在Autofac设置中我有:

builder.RegisterSource(new ViewRegistrationSource());
builder.RegisterType<Test>().As<ITest>();
builder.RegisterType<WebViewPage>().PropertiesAutowired();
builder.RegisterGeneric(typeof(WebViewPage<>)).PropertiesAutowired();

但是当我在视图中访问Test属性时,它是null。

为什么?

更新2

如果在我的布局视图中添加:

@{
  var test = DependencyResolver.Current.GetService<ITest>();
}

测试得到正确解决......

这可能是布局页面和Autofac的问题吗?

更新3

我能够复制问题并在https://github.com/mdmoura/MvcAutofac

中创建了一个项目

如果您运行项目,第二个代码行上的_Layout母版页上会出现错误:

  @SettingsA.Get()
  @SettingsB.Get()

使用DependencyResolver在ViewPagePage中解析SettingsA,它可以正常工作。

使用SettingsB我正在尝试使用Property Injection而没有运气。

Autofac配置位于global.asax Application_Start。

有谁知道可能出错了什么?

1 个答案:

答案 0 :(得分:7)

属性注入不会在 Autofac 中自动完成。您必须告诉 Autofac 注入控制器注册属性。

builder.RegisterControllers(typeof(MvcApplication).Assembly)
       .PropertiesAutowired();

有关自动装配属性的详细信息,请参阅Property and Method Injection