質問

簡単なカスタムをしてみました 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 のカスタム サブクラスでこれを行うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top