asp.net-mvc-3 - Autofac 未填充操作过滤器属性

标签 asp.net-mvc-3 autofac action-filter

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

根据the autofac wiki我只需要注册我想要注入(inject)的类型,调用RegisterFilterProvider,并在我的 Action 过滤器上放置一个公共(public)属性,然后autofac将在过滤器实例化期间用正确的对象填充该属性。 p>

这是我的操作过滤器的一部分:

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 属性为空。

我错过了什么?

最佳答案

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

关于asp.net-mvc-3 - Autofac 未填充操作过滤器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10105579/

相关文章:

c# - 尝试在 ASP.NET MVC3 View 中将 EditorFor 与 ICollection<string> 一起使用?

c# - 使用 autofac 注册多个 dbcontext,其中构建器不可用于注册后解析类

asp.net-mvc - 在 ASP.NET MVC 中使用 SSL 操作过滤器重定向循环

asp.net-mvc - 如何在 ASP.NET MVC 的所有操作中安装操作过滤器?

asp.net-mvc - 如何在AuthorizeAttribute中设置viewbag?

asp.net-mvc-3 - Ninject 到一个 Webactivator 调用的类中

asp.net-mvc-3 - ASP.NET MVC 3 中用于多个文件上传的 ViewModel

c# - 使脚本包包含另一个脚本包

c# - 使用 log4net + AutoFac 拦截器记录所有处理的异常

automapper - Windsor CaSTLe 相当于 Autofac 的 IStartable