私はいくつかの依存関係を注入する必要がある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
のプロパティは空です。
私は何を欠席しましたか?
ありがとうございます!今のところ、私はフィルタで 'DependencyResolver.Current.GetService(Of TraceSource)'を直接呼び出すだけですが、後であなたの提案を試みます。 –
C#で上記答え: 'builder.Register(C =>新しいMyHandleErrorAttribute())\t \t \t \t .AsExceptionFilterFor().InstancePerHttpRequest();' –
Pete
及び場合、エラー・アクション・フィルタではない場合、登録は次のようになります。 builder.Register(c => new SomeGlobalActionFilter()) .AsActionFilterFor().PropertiesAutowired()。InstancePerRequest(); –
Sergey