11

Ninject を使用してコンストラクターの依存関係をフィルターに挿入する方法を見つけようとしています。現在は推奨されていないプロパティ注入について説明している多くの記事を見つけていますが、残りの記事には、ファクトリ、ロケーター、グローバル ラッパー、またはスタブ属性を使用した複雑な設定が含まれています。

MVC を使用すると、操作のほぼすべての部分をオーバーライドできるため、独自の依存関係リゾルバーを作成する方法と同様の方法で独自のフィルター プロバイダーを作成するだけの場合だと思いました。

インジェクションを許可する現在の正しい方法は何ですか? または、特定のタイプのフィルターを使用すると、他のタイプよりも簡単になりますか?

 public class UserValidationAttribute : ActionFilterAttribute
 {
    private IRepository repository;

    public UserValidationAttribute(IRepository repository)
    {
        this.repository = repository;
    }
}
4

3 に答える 3

18

コンストラクター注入を使用する方法があります。

最初に、属性をマーカーとして使用する「空の」属性に置き換えます

public class UserValidationAttribute : Attribute { }

次に、フィルタ クラスを として作成しますIActionFilter

public class UserValidationFilter : IActionFilter
{
    private readonly IRepository repository;

    public UserValidationFilter(IRepository repository)
    {
        this.repository = repository;
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //do something
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //do something
    }      
}

次に、次のようなもので登録できます

private static void RegisterServices(IKernel kernel)
{
    kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
        .WhenActionMethodHas<UserValidationAttribute>();
}

属性自体にコンストラクターパラメーターがある場合は、それらを次のように渡すことができます

kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
    .WhenActionMethodHas<UserValidationAttribute>();
    .WithConstructorArgumentFromActionAttribute<UserValidationAttribute>("myParameter", attr => attr.MyParameter);

BindFilter構文はNinject.Web.Mvc.FilterBindingSyntaxの一部です。

于 2013-09-26T11:55:11.240 に答える
0

ファイラーに依存関係を注入する場合は、コンストラクター注入の代わりにプロパティ注入を使用します。

public class UserValidationAttribute : ActionFilterAttribute
{
    [Inject]
    private IRepository repository { get; set; }

    public UserValidationAttribute()
    {
    }
}

https://stackoverflow.com/a/7192754/296861

于 2013-09-25T21:45:02.410 に答える