6

我在 ASP.NET MVC 3 应用程序中有一个操作过滤器,需要将一些依赖项注入其中。我使用 Autofac.Mvc3 作为依赖注入器。

根据autofac wiki,我只需要注册我想要注入的类型,调用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对象,所以注册好像没问题。

但期间OnActionExecuting我的tracer财产是空的。

我错过了什么?

4

1 回答 1

4

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 将创建过滤器并适当地包含它们。这种方法的优点是您可以重构过滤器,使过滤器不是属性派生的,然后使用构造函数而不是属性注入。

于 2012-04-11T14:50:29.463 回答