2012-04-11 4 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オブジェクトを取得しましたが、登録はOKと思われます。

しかし、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)'を直接呼び出すだけですが、後であなたの提案を試みます。 –

+2

C#で上記答え: 'builder.Register(C =>新しいMyHandleErrorAttribute())\t \t \t \t .AsExceptionFilterFor ().InstancePerHttpRequest();' – Pete

+0

及び場合、エラー・アクション・フィルタではない場合、登録は次のようになります。 builder.Register(c => new SomeGlobalActionFilter()) .AsActionFilterFor ().PropertiesAutowired()。InstancePerRequest(); – Sergey

関連する問題