【发布时间】:2016-02-20 02:38:38
【问题描述】:
我正在使用构造函数注入在我的控制器中成功使用 ASP.NET 5/MVC 6 DI。
我现在有一个场景,我希望我的视图模型在实现 IValidatableObject 时使用 Validate 方法中的服务。
ViewModel 中的构造函数注入不起作用,因为它们需要默认的无参数构造函数。验证 Context.GetService 也不起作用。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
MyService myService = (MyService)validationContext.GetService(typeof(MyService));
总是导致 MyService 为空。
ASP.NET 4,我将创建 ValidatableObjectAdapter,通过 DataAnnotationsModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory 注册它,然后我可以使用 validationContext 对象对服务的引用。
我目前正在为 ASP.NET 5 使用构建在 DI 容器中,将在某个阶段移至结构图)这不重要。
我的具体验证是对象的属性(例如,用户名)是唯一的。我想将此测试委托给服务层。
【问题讨论】:
-
ViewModel 不应包含业务逻辑。在这种情况下,你应该有一个 ValidatorProcessor,你没有理由不能使用构造函数注入。
-
我并不是说 viewModel 会有业务逻辑。该模式要么是 If (myService.IsDuplicate(Name)) {yieldReturn new validationResult,要么是 return myService.ValidateCanCreate(Name, Type, SomeOtherProperty) - 无论如何,ValidatorProcessor 是什么?我似乎找不到任何相关的参考资料。
-
您说“视图模型中的构造函数注入”。我不明白你为什么需要这样做,我不明白为什么你不能在那里进行构造函数注入,如果你有正当理由这样做的话。
-
@mason - 见最后一句话 - 对象名称必须是唯一的。
-
使用视图模型属性的 [FromServices] 属性在模型绑定期间使用属性注入。 odetocode.com/blogs/scott/archive/2016/02/18/…
标签: asp.net asp.net-mvc asp.net-core asp.net-core-mvc