c# - 根据其他值获取对象实例,而不使用服务位置

标签 c# asp.net-mvc-3 dependency-injection ninject-2

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

我正在使用一个名为 MyModel 的抽象基本模型,它有 2 个具体子类 MyModel1MyModel2。这些需要根据用户记录中设置的值发送到 View 。

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());
    }

这工作得很好(虽然我不喜欢它,但它很简单并且有效。问题是在使用依赖注入(inject)时使用 new 是一种反模式。此外,我现在希望模型能够初始化自身(从数据库)所以我需要将 IUnitOfWork 注入(inject)到模型的构造函数中。我当然可以这样做:

if (user.myprop == somevalue)
{
    return View(DependancyResolver.Current.GetService(typeof(MyModel1)));
}

但是服务位置也是一种反模式。

关于如何解决这个问题有什么建议吗?

最佳答案

如果使用正确,使用 new 并不是 DI 的反模式。使用new来创建 View 模型等数据容器是绝对没有问题的。

但对于 MVC 应用程序来说,在 View 模型中包含逻辑或数据检索代码是一种反模式,因此它们需要依赖项。所有这些东西都属于 Controller 或某些服务的外部。数据从外部分配给 View 模型并进行预格式化。

关于c# - 根据其他值获取对象实例,而不使用服务位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7261472/

相关文章:

c# - 我怎样才能用 .txt 文件填充我的组合框,但只有他们的名字没有路径?

c# - 使用逗号分隔的 ID 列表构建检查 (lucene.net) 索引

c# - 注释复杂类型时远程验证失败

c# - 使用 StructureMap 注入(inject)连接字符串不起作用

javascript - 异步加载 qUnit

c# - 如何使用 Web api2 在 asp.net MVC 中制作异步和等待方法

c# - 如何在关闭前暂停cmd?

asp.net-mvc - 如何将多个默认值添加到 ASP.NET MVC3 中的 SelectList

c# - ASP.Net C# 如何使网站上的页面在通过登录进行身份验证后可访问

java - Spring DI 的线程安全影响