C# 基于其他值获取对象实例,而不使用服务位置

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

我在使用Ninject的mvc 3应用程序中使用了工作单元模式。我遇到了一个问题,如果不使用新的或某种服务位置,我很难解决它

我正在使用一个名为MyModel的抽象基础模型,它有两个具体的子类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)));
}
但服务定位也是一种反模式

对如何解决这个问题有什么建议吗

此外,我现在希望模型从 所以我需要将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实例。