我第一次学习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。
答案 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)
{
...
}
}