NinjectHttpApplication
プロジェクトで定義されたいくつかのモジュールを使用しています。
私が望むのは、 http://www.thekip.nl/2011/09/22/using-fluentvalidation-for-both-domain-validation-and-validation-in-mvc-projects/FluentValidation
で説明されているように、検証ファクトリを作成することです。
具体的な検証ファクトリを作成するには、オーバーライドする必要があります
IValidator CreateInstance(Type validatorType)
次に呼び出すメソッド
return kernel.Get<validatorType>() as IValidator
しかし、範囲外で IKernel を使用することGlobal.asax
は推奨されないことを読みました。
私が望むものを作るためのオプションは何ですか?
編集: Ninject-FluentValidation 拡張機能の使用
Remo が述べているように、拡張機能がありますGitHub
( https://github.com/ninject/ninject.web.mvc.fluentvalidation )。拡張機能には次のクラスがあります。
public class NinjectValidatorFactory : ValidatorFactoryBase { ... }
コンストラクターを受け取りIKernel
、インスタンスを作成しますIValidator
public override IValidator CreateInstance(Type validatorType)
{
if(((IList<IBinding>)Kernel.GetBindings(validatorType)).Count == 0)
{
return null;
}
return Kernel.Get(validatorType) as IValidator;
}
私のコードは次のようになります:
public class MvcApplication : NinjectHttpApplication
{
private NinjectValidatorFactory nvfactory;
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Employee", action = "Index", id = UrlParameter.Optional }
);
}
protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(nvfactory));
}
protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
nvfactory = new NinjectValidatorFactory(kernel);
return kernel;
}
}
それはうまくいきます。しかし、それがより良く解決できるかどうかはわかりません。IKernel
また、上のパブリック プロパティとして公開する必要性がわかりませんNinjectValidationFactory
。