加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 模型需要注入依赖项时的模型(ViewModel)绑定

发布时间:2020-12-16 04:20:03 所属栏目:asp.Net 来源:网络整理
导读:我正在使用Ninject在ASP.Net MVC应用程序中进行依赖注入(这是我的第一个使用Ninject或DI的项目). 我选择使用Model-View-ViewModel模式.视图模型将提供我将绑定到实际视图的所有属性,但还需要访问数据库以获取数据列表等内容.例如: public class CreateGetIn
我正在使用Ninject在ASP.Net MVC应用程序中进行依赖注入(这是我的第一个使用Ninject或DI的项目).

我选择使用Model-View-ViewModel模式.视图模型将提供我将绑定到实际视图的所有属性,但还需要访问数据库以获取数据列表等内容.例如:

public class CreateGetIncidentViewModel
{

    private IDBContext _dbContext = null;

    [Required]
    public EmployeeType EmployeeType { get; set; }


    [Required]
    [StringLength(50)]
    public string Department { get; set; }

    /
    public IEnumerable<SelectListItem> GetEmployeeTypeSelectList()
    {
        // Simplified for brevity
        var employeeTypes = _dbContext.EmployeTypes.Where().... // Go select the employee types

        var employeeTypeSelectList = new List<SelectListItem>();

        foreach(var employeeType in employeeTypes){
            employeeTypeSelectList.Add(new SelectListItem(){
                // Set select list properties
            });
        }           

        return employeeTypeSelectList;
    }
}

我的问题是:

> IDBContext是Ninject中的注册依赖项.通过实例化直接访问具体类型将是禁忌.
>我必须以某种方式将这种依赖注入到这个类中,或以某种方式通过已经解析了依赖关系的其他类来访问依赖项.

鉴于我的ViewModel经常通过模型绑定由ASP.Net MVC自动补充,我如何将我的依赖项放入我的ViewModel?

我经历过多种方式,但它们看起来都很脏.我可以(但不想)

>实现服务定位器模式,只需从ViewModel中解析我的IDBContext依赖关系.
>解析我的控制器中的IDBContext,并在手动构建ViewMode时将其传递给我的ViewModel,即新的CreateGetIncidentViewModel(dbContext);

>虽然将模型发布到动作时,这并不能解决视图模型被MVC水合的问题

建议?

解决方法

Given that my ViewModel is often hydrated by ASP.Net MVC automatically
through model binding,how do I get my dependency into my ViewModel?

您可以编写一个自定义模型绑定器,将依赖项注入视图模型构造函数.

这就是说,使用ASP.NET MVC中的MVVM模式恕我直言从一开始就是错误的方法,如果你这样做,你必须为许多痛苦做好准备.你准备好了吗?

如果没有,这是我建议你的:

Controller -> Domain model -> View model -> View

在这种模式中,您可以让控制器了解存储库(DbContext – 由DI框架自动注入其中).

流程1:

>控制器接收来自用户的请求
>控制器使用存储库查询一个或多个域模型
>控制器使用映射层将这些域模型映射到视图模型
>控制器将此(单个)视图模型传递给视图以进行渲染

流程2:

>控制器从视图接收请求(例如表单提交)
>模型绑定器自动将请求主体绑定到控制器操作作为参数的单个视图模型
>控制器正在使用映射层将此视图模型映射到一个或多个域模型
>控制器正在使用存储库来更新这些域模型.

在此示例中,视图模型不了解任何存储库或数据访问或DbContexts.视图模型是视图的表示.域模型和视图之间的映射是控制器的责任(可以委托给映射层).我个人使用AutoMapper来执行我的域模型和视图模型之间的映射.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读