我在 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/