ASP.NET MVC FilterAttribute で依存性注入/IoC を使用することはできますか?
質問
簡単なカスタムをしてみました FilterAttribute
いろいろ飾って使っています ActionMethods
.
例えば。
[AcceptVerbs(HttpVerbs.Get)]
[MyCustomFilter]
public ActionResult Bar(...)
{ ... }
ここで、この CustomFilter アクションにログを追加したいと思います。だから良い子なので、私は使っています DI/IoC
...したがって、このパターンを私のカスタムに使用したいと考えています FilterAttribute
.
それで、私が次のものを持っているとしたら...
ILoggingService
これを私のカスタムに追加したいと思っています FilterAttribute
..方法がわかりません。たとえば、次のことを行うのは簡単です...
public class MyCustomFilterAttribute : FilterAttribute
{
public MyCustomFilterAttribute(ILoggingService loggingService)
{ ... }
}
しかし、コンパイラエラーは、私のものを装飾する属性を言う ActionMethod
(上にリストされています...) 1 つの引数が必要です ..だから私は何をすべきかわかりません:(
解決
プロパティ注入が機能しています ニンジェクト そしてその Ninject.Web.MVC.
Ninject.Web.MVC からコントローラー ファクトリを取得している限り、それはかなり単純です。
例えば。
public class EventExistsAttribute : FilterAttribute, IActionFilter
{
[Inject]
public IEventRepository EventRepo { private get; set; }
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//Do stuff
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//Do something else if you so wish...
}
}
これには、本質的に「隠れた」依存関係があるという欠点があります...しかしそれに関してできることはあまりありません。
HTH、
チャールズ
他のヒント
独自の IActionInvoker を作成し、プロパティ インジェクションを行う必要があります。見て これ Jimmy Bogard によるアイデア投稿。
はい、FilterAttribute で依存関係の注入を使用できます。ただし、FilterAttribute でコンストラクター インジェクションを使用することはできません。これは ASP.NET MVC の制限ではなく、すべての .Net コードに共通です。 属性コンストラクターに渡される値は単純な型に限定されます.
[MyFilter(ILogger logger)] // this will not compile
public ActionResult Index()
{
return View();
}
したがって、一般的な方法は、依存関係を 財産 @Charlinoの例のように、フィルターの。その後、プロパティ注入を使用できます。@Charlino の例のように、Ninject を使用してフィルター プロパティを装飾できます。または、@mrydengren が提案しているように、ControllerActionInvoker のカスタム サブクラスでこれを行うことができます。