我在 ASP.Net MVC 应用程序中使用 Ninject 进行依赖注入(这是我第一个使用 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 中,即
new CreateGetIncidentViewModel(dbContext);
- 这并不能解决视图模型被 MVC 水合的问题,尽管当模型被发布到一个动作时
建议?