【问题标题】:Autofac with MVC 4 action filter property injectionAutofac 与 MVC 4 动作过滤器属性注入
【发布时间】:2014-03-13 01:04:16
【问题描述】:

我将 Nuget MVC3 集成包用于 Autofac 和 MVC4。它主要工作(使用控制器的构造函数注入效果很好),但它不会将注册的服务注入到动作过滤器属性中。

这是我在 Global.asax.cs 中的注册:

builder.RegisterType<AspNetMembershipProviderWrapper>().As(typeof(IUserService)).InstancePerHttpRequest();
// 5) action filters
builder.RegisterType<SetCultureAttribute>().As<IActionFilter>().PropertiesAutowired().SingleInstance();
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

然后在SetCultureAttribute我有这个:

public IUserService _userService { get; set; } // it doesn't get injected, null

这在属性的构造函数中也不起作用:

_userService = DependencyResolver.Current.GetService<AspNetMembershipProviderWrapper>(); // always returns null

DependencyResolver.Current.GetService() 在操作过滤器的构造函数中调用时也会为所有其他已注册服务返回 null(我在调试窗口中对其进行了测试)。

所以我猜有些事情不正常。可以使用 MVC3 集成还是我应该使用 MVC4 Nuget 包(它说它是用于 RC)?

还有什么我可以尝试的吗?

【问题讨论】:

  • 在您的示例中,_userService 是一个公共只读 字段,但属性注入(顾名思义)需要属性(例如 public IUserService UserService { get; set;})。那么这是您的样本中的错字还是问题的根源?
  • 你是对的,我更新了代码,但没有任何区别。如果属性注入不起作用并且 DependecyResolver.Current.GetService 起作用但它也不起作用,一切都会好起来的。

标签: asp.net-mvc asp.net-mvc-4 autofac


【解决方案1】:

为了让 ActionFilter 注入工作,您需要注册提供程序,我在您的示例中没有看到:

builder.RegisterFilterProvider();

这里有相关文档: http://code.google.com/p/autofac/wiki/MvcIntegration3

在任何一种情况下,您都将服务注册为 IUserService,因此您必须这样解决它。

_userService = DependencyResolver.Current.GetService<IUserService>();

您不需要注册该属性。查看上面的 wiki 链接了解更多信息。

【讨论】:

  • 哇,谢谢,我怎么会错过 GetService 参数中的 IUserService 类型? :)
  • 过滤器提供程序已注册,但 GetService
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多