2012-04-11 22 views
6

我在ASP.NET MVC 3應用程序中需要一些注入其中的操作過濾器。我使用Autofac.Mvc3作爲依賴注入器。Autofac未填充操作過濾器屬性

根據the 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

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將創建過濾器,並適當地包括它們。這種方法的優點是你可以重構所以過濾器不是屬性派生的,然後使用構造函數而不是屬性注入。

+0

謝謝!現在,我只是直接在過濾器中調用'DependencyResolver.Current.GetService(Of TraceSource)',但稍後我會嘗試您的建議。 – 2012-04-13 05:47:05

+2

上述C#中的答案: 'builder.Register(C =>新MyHandleErrorAttribute())\t \t \t \t .AsExceptionFilterFor ().InstancePerHttpRequest();' – Pete 2014-02-03 19:01:06

+0

和的情況下,如果它不是一個錯誤動作濾波器,註冊將如下所示: builder.Register(c => new SomeGlobalActionFilter()) .AsActionFilterFor ().PropertiesAutowired()。InstancePerRequest(); – Sergey 2015-01-07 11:26:16