Autofac不填充作用,筛选器属性(Autofac is not filling action f

2019-09-16 11:17发布

我有在ASP.NET MVC 3应用程序,需要注射到它的一些依赖关系的行为过滤器。 我使用Autofac.Mvc3作为依赖注入。

根据该autofac维基我只需要注册,我想注入,调用类型RegisterFilterProvider ,并把公共财产在我的行为过滤,然后将autofac过滤器实例化过程中填充合适的对象的属性。

这里是我的行为过滤器的一部分:

Public Class LogActionAttribute
    Inherits ActionFilterAttribute

    Property tracer As TraceSource

    Public Overrides Sub OnActionExecuting(filterContext As System.Web.Mvc.ActionExecutingContext)
        ...
        tracer.TraceData(...)
        ...
    End Sub
End Class

这里是我的Global.asax的一部分:

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
        filters.Add(New MyHandleErrorAttribute)
        filters.Add(New LogActionAttribute)
    End Sub

    Sub Application_Start()
        InitSettingRepoEtc()
        ...
    End Sub

    Protected Shared Sub InitSettingRepoEtc()
        ...
        Dim builder = New ContainerBuilder
        builder.RegisterControllers(Reflection.Assembly.GetExecutingAssembly)
        ...
        builder.Register(Of TraceSource)(
            Function(x) New TraceSource("requests", SourceLevels.All)).InstancePerHttpRequest()
        ...
        builder.RegisterFilterProvider()
        Dim container = builder.Build
        DependencyResolver.SetResolver(New AutofacDependencyResolver(container))
        ...
    End Sub
End Class

我已经把断点右后SetResolver和尝试即时窗口:

DependencyResolver.Current.GetService(Of TraceSource)

我顺利地拿到了从autofac一个TraceSource对象,所以注册似乎是确定。

但在OnActionExecutingtracer属性为空。

我错过了什么?

Answer 1:

IIRC提供者不具有“全球性”过滤器工作。

删除这个功能:

Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
    filters.Add(New MyHandleErrorAttribute)
    filters.Add(New LogActionAttribute)
End Sub

取而代之,注册Autofac直接的全局过滤器:

 builder.Register(Of MyHandleErrorAttribute)
     .As(Of IActionFilter)
     .PropertiesAutowired()
     .SingleInstance();

 builder.Register(Of LogActionAttribute)
     .As(Of IActionFilter)
     .PropertiesAutowired()
     .SingleInstance();

Autofac将创建过滤器,并适当地包括它们。 这种方法的好处是,你可以重构所以过滤器不会属性衍生,然后用构造函数,而不是财产注射。



文章来源: Autofac is not filling action filter property