FluentValidation 验证工厂和 Ninject DI 容器
我正在使用 NinjectHttpApplication
以及我的项目中定义的几个模块。
我想要的是创建 FluentValidation
验证工厂,如 http://www.thekip.nl/2011/09/22/using-fluidation-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. Fluidvalidation)。扩展中有一个类:
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
上的公共属性。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Ninject.Web.Mvc.FluentValidation 扩展向 Ninject 添加了对流畅验证的支持。可以在 NuGet 上找到它。请参阅https://github.com/ninject/ninject.web.mvc.fluidation
The Ninject.Web.Mvc.FluentValidation extension adds support for fluent validation to Ninject. It can be found on NuGet. See https://github.com/ninject/ninject.web.mvc.fluentvalidation
我强烈建议阅读 Mark Seemann 的.NET 中的依赖注入< /a> 书。
为了简单起见,如果您希望向容器请求依赖项,则您没有使用依赖项注入。你不调用容器。它会打电话给你。
I highly advise reading Mark Seemann's Dependency Injection in .NET book.
To keep it simple, if you're looking to ask the container for a dependency, you're not using Dependency Injection. You don't call the container. It'll call you.
这很简单。我向您展示一个简单的控制台应用程序来演示使用 NInject 进行 FluentValidation。
Install-Package NInject
Install-Package FluentValidation
创建以下类。
4.程序类中的main方法如下。
This is pretty simple. I show you a simple console app to demonstrate FluentValidation with NInject.
Install-Package NInject
Install-Package FluentValidation
Create the following classes.
4.The main method inside the program class would be as follows.
根据您的内核实现,这本身不是问题。
不建议这样做,因为它会创建对内核的依赖关系(因此您使用的是服务位置而不是依赖注入)。
另一种选择是使用 Ninjects 提供者概念,如 所描述亚历山大·贝列茨基。
Depending on your implementation of the kernel, this is not a problem as such.
It is not recommended, as it creates a dependency on the kernel (and as such you are using Service Location and not Dependency Injection).
Another option would be to use Ninjects notion of Providers as described by Alexsander Beletsky.