我正在将 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);

}

然后我在 Controller 上测试了构造函数和属性注入(inject):
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 被注入(inject)并且 TestProperty 始终为空。

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

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

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

更新 1

添加 .PropertiesAutowired(); RegisterController 适用于 Controller ,但不适用于 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();

但是当我在 View 中访问 Test 属性时,它为空。

为什么?

更新 2

如果在我的布局 View 中添加:
@{
  var test = DependencyResolver.Current.GetService<ITest>();
}

测试正确解决...

也许这是布局页面和 Autofac 的问题?

更新 3

我能够复制问题并在 https://github.com/mdmoura/MvcAutofac 中创建了一个项目

如果您运行该项目,在第二行代码的 _Layout 母版页上会出现错误:
  @SettingsA.Get()
  @SettingsB.Get()

SettingsA 在 ViewPagePage 中使用 DependencyResolver 进行解析,并且可以正常工作。

使用 SettingsB 我试图使用属性注入(inject)但没有运气。

Autofac 配置在 global.asax Application_Start 中。

有谁知道可能有什么问题?

最佳答案

Autofac 中不会自动完成属性注入(inject)。您必须告诉 Autofac 在您的 Controller 注册中注入(inject)属性。

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

有关 Autowiring 属性的更多信息,请参阅 Property and Method Injection

关于c# - Autofac 的属性注入(inject)失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29535893/

10-13 03:13