DI与ASP.NET MVC中的viewmodel

时间:2016-07-23 10:25:17

标签: asp.net-mvc dependency-injection inversion-of-control viewmodel

我第一次学习IoC但是无法弄清楚它是如何在标准ASP.NET MVC控制器中使用视图模型和模型绑定的。假设我有一个使用紧密耦合的存储库和视图模型的基本控制器。

getDataC

现在我想使用DI从这个依赖类中松散地耦合这个控制器,所以我在via构造函数注入中注入了存储库和viewmodel

public class Sample
{
    [HttpGet]
    public ActionResult Index()
    {
        var repo = new SampleRepository();
        var model = new SampleViewModel();
        model.SampleItems = repo.Get();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SampleViewModel model) 
    {
        ...
    }
}

我的问题是,我现在正在通过接口注入一个viewmodel,但是HttpPost Action需要一个具体的SampleViewModel才能进行模型绑定?

我误解了它是如何工作的吗?我是否应该尝试从控制器中松散地耦合我的视图模型,或者这只是需要紧密耦合才能使模型绑定器工作的东西?我已经看到人们使用服务层将视图模型返回给控制器的代码,我知道你也可以编写一个自定义模型绑定器,但这对于我想要做的事情来说似乎有点过分了?我所追求的只是一种注入基本视图模型的方式,然后可以被视图用于GET和POST。

1 个答案:

答案 0 :(得分:5)

视图模型实际上任何事情。它基本上只是一个DTO,可以将数据从控制器传输到视图。根据定义,它不能具有任何依赖性。相反,它是应用程序运行时状态的一部分。

Injecting runtime data is anti-pattern。相反,您的控制器应该创建一个viewmodel的实例,因为它总是希望返回一个。没有理由嘲笑它进行测试,也没有理由替换它的实现。因此,也没有理由对它进行抽象(接口或抽象类)。

public class Sample
{
    private readonly ISampleRepository _sampleRepository;

    public Sample(
          ISampleRepository sampleRepository)
    {
        _sampleRepository =  sampleRepository;
    }

    [HttpGet]
    public ActionResult Index()
    {
        var sampleViewModel = new SampleViewModel()
        {
            SampleItems = _sampleRepository.Get(),
            // Other initialization here...
        };

        return View(sampleViewModel);
    }

    [HttpPost]
    public ActionResult Index(SampleViewModel model) 
    {
        ...
    }
}