2013-07-28 182 views
11

我发现了一些关于此问题的问题,但他们倾向于指向我正在遵循的确切文档...但它仍然不起作用。Autofac属性注入属性失败

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

documentation表示只需拨打RegisterFilterProvider()即可,并确保相关类型已注册。它具体说,没有必要注册该属性,但我已经试过和没有。我的代码目前看起来是这样的:

var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

builder.Register(x => new EntityAccessProvider()) 
    .As<IDataAccessProvider>() 
    .InstancePerHttpRequest(); 

builder.RegisterType<DebugLogAttribute>().PropertiesAutowired(); 
//^I've tried it with and without this line 

builder.RegisterFilterProvider(); 
var container = builder.Build(); 

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

在文档的例子然后就放置在过滤器的属性,所以我做了相同的:

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注入到我的控制器中,但它不适用于属性。我错过了什么?

回答

13

您的财产类型IDataAccessProvider必须是公众注射上班。您仍然可以标记DebugLogAttribute,IDataAccessProvider,并且如果您愿意,可以将其作为内部实现。

[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 {} 
+0

糟糕...完全错过了。谢谢! – anaximander

+0

谢谢你的解决方案:) – Redplane