基于其他值获取对象的实例,而不使用服务位置
本文关键字:实例 位置 服务 取对象 于其他 其他 获取 | 更新日期: 2023-09-27 18:07:05
我在使用Ninject的mvc 3应用程序中使用工作单元模式。我遇到了一个问题,如果不使用新的或服务位置,我就很难解决这个问题。
我使用一个抽象的基本模型称为MyModel
,它有2个具体的子类MyModel1
和MyModel2
。这些需要根据用户记录中的值集发送到视图。
public class MyController : Controller
{
private IUnitOfWork _unitOfWork;
public MyController(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; }
...
public ActionResult MyMethod() {
var user = _unitOfWork.Get(user)
if (user.myprop == somevalue)
{
return View(new MyModel1());
}
return View(new MyModel2());
}
这个很好(虽然我不喜欢它,但它很简单而且有效)。问题是在使用依赖注入时使用new是一种反模式。此外,我现在希望模型(从数据库)初始化自己,因此我需要将IUnitOfWork
注入模型的构造函数中。当然,我可以这样做:
if (user.myprop == somevalue)
{
return View(DependancyResolver.Current.GetService(typeof(MyModel1)));
}
但是Service Location也是一个反模式。
对于如何解决这个问题有什么建议吗?如果正确使用,使用new并不是DI的反模式。使用new创建数据容器(如视图模型)绝对没有问题。
但是对于MVC应用程序来说,在视图模型中包含逻辑或数据检索代码是一个反模式,因此它们需要依赖关系。所有这些东西都属于控制器或某些服务。数据从外部预先格式化分配给视图模型。
另外,我现在希望模型初始化自己(从的构造函数中注入IUnitOfWork模型
。您不应该将任何模型传递给视图。你只传递视图模型。视图模型是愚蠢的。它们只包含视图要显示的预格式化数据。例如,如果你使用AutoMapper,你可以将其外部化到映射层,你的控制器可以变成:
public ActionResult MyMethod() {
var user = _unitOfWork.Get(user)
var userViewModel = Mapper.Map<User, UserViewModel>(user);
return View(userViewModel);
}