【发布时间】:2012-01-25 13:15:10
【问题描述】:
我正在使用NinjectHttpApplication,并在我的项目中定义了几个模块。
我想要的是创建FluentValidation 验证工厂,如http://www.thekip.nl/2011/09/22/using-fluentvalidation-for-both-domain-validation-and-validation-in-mvc-projects/ 中所述。
要创建一个具体的验证工厂,我需要重写
IValidator CreateInstance(Type validatorType)
我应该调用的方法
return kernel.Get<validatorType>() as IValidator
但我读过不建议在Global.asax 范围之外使用 IKernel。
有哪些选择可以满足我的需求?
编辑:使用 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 上的公共财产。
【问题讨论】:
标签: c# dependency-injection ninject fluentvalidation