asp.net - ASP.NET Core/MVC 6 ViewModel 中的依赖注入(inject) (DI)

标签 asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我通过构造函数注入(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/

相关文章:

asp.net - 在 ASP.NET MVC3 中使用 jQuery 的具有可点击日期的事件日历

mysql - Ubuntu Linux 上的 dotnet 核心使用 asp.net MVC 和 EF MySQL 错误 NU1001 : cannot restore MySql. Data.EntityFrameworkCore

docker - 未从dockerfile发布具有Net Core 3.1 API的Dockerfile

asp.net-core - ASP.NET Core 3.1 在单独的类库中获取 wwwroot 路径

jquery - IE11和IE10中的模糊事件功能

c# - 自定义 MVC5 ASP.NET Identity 中的 cookie 值

c# - 处理由 asp.net 页面触发的频繁数据库写入

javascript - 使用javascript更改文档的背景颜色

javascript - 如何将 div 元素放入 jQuery Slider 中,显示至少 5 个元素,并使用左右 slider 查看更多元素?

javascript - 根据下拉列表中选择的值切换 <div>