C# 基于其他值获取对象实例,而不使用服务位置
我在使用Ninject的mvc 3应用程序中使用了工作单元模式。我遇到了一个问题,如果不使用新的或某种服务位置,我很难解决它 我正在使用一个名为MyModel的抽象基础模型,它有两个具体的子类MyModel1和MyModel2。这些需要根据用户记录中设置的值发送到视图C# 基于其他值获取对象实例,而不使用服务位置,c#,asp.net-mvc-3,dependency-injection,ninject-2,C#,Asp.net Mvc 3,Dependency Injection,Ninject 2,我在使用Ninject的mvc 3应用程序中使用了工作单元模式。我遇到了一个问题,如果不使用新的或某种服务位置,我很难解决它 我正在使用一个名为MyModel的抽象基础模型,它有两个具体的子类MyModel1和MyModel2。这些需要根据用户记录中设置的值发送到视图 public class MyController : Controller { private IUnitOfWork _unitOfWork; public MyController(IUnitOfWork u
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)));
}
但服务定位也是一种反模式
对如何解决这个问题有什么建议吗
此外,我现在希望模型从
所以我需要将IUnitOfWork注入
模型
否。不应将任何模型传递给视图。只能传递视图模型。视图模型是愚蠢的。它们仅包含视图要显示的预格式化数据。例如,如果您使用,您可以将其外部化到映射层中,并且您的控制器可以成为:
public ActionResult MyMethod() {
var user = _unitOfWork.Get(user)
var userViewModel = Mapper.Map<User, UserViewModel>(user);
return View(userViewModel);
}
如果使用正确,使用new不是DI的反模式。使用new创建数据容器(如视图模型)绝对没有问题
但是,MVC应用程序在视图模型中具有逻辑或数据检索代码,因此它们需要依赖关系,这是一种反模式。所有这些东西都属于控制器或某些服务的外部。数据从外部预先格式化分配给视图模型。我不清楚,我指的是我的视图模型。我想为数据库中的视图初始化SelectList之类的东西。也许你是对的,我不应该每次创建视图模型时都进行数据库查找。@Mystere-Man,初始化任何内容都不是视图模型的责任。理想情况下,在将域模型转换为视图模型时,这应该在映射层中完成。因此,我不确定AutoMapper如何在选择列表中填充它们,而这些选择列表不是用户模型的一部分。我想那只是因为我不熟悉AutoMapper@Mystere伙计,AutoMapper在一种类型到另一种类型之间转换。您可以为此转换定义规则。例如,如果在用户模型中有一些键/值对的列表,则可以将其转换为SelectList。检查文档:是的,阅读一些稀疏的文档并没有真正的帮助。我需要1根据user.prop的值创建一个MyModel1或MyModel2,然后我需要使用IUnitOfWork从dal中的存储库中检索正确选择的视图模型的数据,以便将其交给视图。我不知道AutoMapper如何帮助我在不使用新位置或服务位置的情况下,基于用户数据创建正确的ViewModel实例。