Autofac属性注入在属性上失败

我已经找到了一些问题,但是他们倾向于指出我正在遵循的确切文档……但它仍然没有用。

我正在构建一个相当简单的ASP.NET MVC 4站点,计划是使用基于ActionFilterAttribute的日志记录。 我有一个DataAccessProvider类,它打开与数据库的事务并提供工作单元实例,我试图将它注入filter属性。

文档说只需调用RegisterFilterProvider()就足够了,并确保注册相关类型。 它特别说没有必要注册属性,但我已经尝试了有无。 我的代码目前看起来像这样:

 var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.Register(x => new EntityAccessProvider()) .As() .InstancePerHttpRequest(); builder.RegisterType().PropertiesAutowired(); // ^ I've tried it with and without this line builder.RegisterFilterProvider(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

然后,文档中的示例只是在filter上放置一个属性,所以我做了同样的事情:

 public class DebugLogAttribute : ActionFilterAttribute { private IDataAccessProvider DataAccess { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { ... } public override void OnActionExecuted(ActionExecutedContext filterContext) { ... } } 

文档说这一切都是必需的 – 甚至不是注入的构造函数; 这是通过财产注入完成的。 但是,当我运行此代码时, DataAccess属性始终为null ; Autofac似乎忽略了它。 我知道注册工作正常,因为它正确地将EntityAccessProvider注入我的控制器,但它不适用于属性。 我错过了什么?

您的IDataAccessProvider类型的属性必须公开才能注入工作。 如果您愿意,您仍然可以将DebugLogAttributeIDataAccessProvider及其实现标记为内部。

 [DebugLogAttribute] public class HOmeController : Controller { public ActionResult Index() { return View(); } } internal class DebugLogAttribute : ActionFilterAttribute { public IDataAccessProvider DataAccess { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { Debugger.Break(); } public override void OnActionExecuted(ActionExecutedContext filterContext) { Debugger.Break(); } } internal interface IDataAccessProvider {} internal class DataAccessProvider:IDataAccessProvider {}