我通过构造函数注入(inject)在 Controller 中成功使用了 ASP.NET 5/MVC 6 DI。
我现在有一个场景,我希望我的 View 模型在实现 IValidatableObject 时在 Validate 方法中使用服务。
ViewModel 中的构造函数注入(inject)不起作用,因为它们需要默认的无参数构造函数。验证 Context.GetService 也不起作用。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
MyService myService = (MyService)validationContext.GetService(typeof(MyService));
始终导致 MyService 为 null。
ASP.NET 4,我将创建 ValidatableObjectAdapter,通过 DataAnnotationsModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory 注册它,然后我可以使用 validatableContext 来对象引用服务。
我目前正在使用 ASP.NET 5 的 DI 容器中的构建,将在某个阶段转向结构图)但这并不重要。
我的具体验证是对象的属性(例如,用户名)是唯一的。我想将这个测试委托(delegate)给服务层。
最佳答案
从 ASP.NET RC2 开始,[FromServices] 已被删除。
如果您希望 viewModel 中的 DI 纯粹用于 IValidatableObject.Validate,那么您可以使用validationContext.GetService(type) 来获取您的服务。这在 RC1 中不起作用
EG
MyService myService = (MyService)validationContext.GetService(typeof(myService));
这是一个通用的扩展方法,可以让它更容易处理。
public static class ValidationContextExtensions
{
public static T GetService<T>(this ValidationContext validationContext)
{
return (T)validationContext.GetService(typeof(T));
}
}
关于asp.net - ASP.NET Core/MVC 6 ViewModel 中的依赖注入(inject) (DI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518476/