2016-09-21 12 views
1

私はAsp.Net Core Web APIでカスタム検証属性を作成しています。バリデーターのIDataProtectorとデータベースにアクセスするために使用している別のサービスにアクセスする必要があります。私は検索しましたが、abはありませんでした。 ActionFiltersにはServiceFilterを使用するオプションがありますが、Validation Attributeにはオプションがないようです。何か案は?検証属性への依存関係の挿入Web Api Asp.Netコア

+0

表現としてあなたは、属性に依存関係を注入してはならない[ここ](https://stackoverflow.com/a/ 29916075/264697)、[ここ](http://blog.ploeh.dk/2014/06/13/passive-attributes/)、[ここ](https://www.cuttingedge.it/blogs/steven/pivot) /entry.php?id=97)。 – Steven

答えて

1

一般に、検証属性はプロパティで定義されるため、コンストラクタを介して参照を受け取ることはできません。あなたがモデルバインディングを深く知っていれば、プロパティの注入を可能にするためにカスタマイズするものがあるかもしれませんが、実際にはValidateメソッドの依存関係リゾルバへの参照を取得し、適切なメソッドを呼び出します。

0

ValidationContextのGetService()メソッドを使用してデータベースを取得します。あなたはisValidメソッドをオーバーライドして、依存関係を解決するためにvalidationContextを使用することができます

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    MyDbContext db = (MyDbContext) validationContext.GetService(typeof(MyDbContext)); 
    //... 
} 
0

すなわち :

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    var service = (IExternalService) validationContext.GetService(typeof(IExternalService)); 
    // use service 
} 
関連する問題