我正在使用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;
}
}
鉴于我的ViewModel经常通过模型绑定由ASP.Net MVC自动补充,我如何将我的依赖项放入我的ViewModel?
我经历过多种方式,但它们看起来都很脏。我可以(但不想)
new CreateGetIncidentViewModel(dbContext);
建议?
答案 0 :(得分:13)
鉴于我的ViewModel经常被ASP.Net MVC自动补充 通过模型绑定,如何将我的依赖项纳入我的ViewModel?
您可以编写一个自定义模型绑定器,将依赖项注入视图模型构造函数。
这就是说,使用ASP.NET MVC中的MVVM模式恕我直言从一开始就是错误的方法,如果你这样做,你必须为许多痛苦做好准备。你准备好了吗?
如果没有,我建议你这样做:
Controller -> Domain model -> View model -> View
在这种模式中,您可以让控制器了解存储库(DbContext
- 由DI框架自动注入其中)。
流程1:
流程2:
在此示例中,视图模型不了解任何存储库或数据访问或DbContexts。视图模型是视图的表示。域模型和视图之间的映射是控制器的责任(可以委托给映射层)。我个人使用AutoMapper
来执行我的域模型和视图模型之间的映射。
答案 1 :(得分:2)
如果您希望使用Darin提到的Custom Model Binder路线,请查看:https://stackoverflow.com/a/24166483/71906