【问题标题】:MVC3 Controller constructor + NinjectMVC3 控制器构造函数 + Ninject
【发布时间】:2011-05-21 02:59:06
【问题描述】:

我目前正在开发一个 MVC3 Web 应用程序,并遇到了 Ninject 的一个新问题。

我在控制器中使用以下代码:

public class TestController : Controller
{       
    public IRepository<CustomerModel> rep;

    public TestController(IRepository<CustomerModel> repository)
    {
        this.rep = repository;
    }

    public ActionResult Index()
    {
        return View();
    }
}

还有我的忍者模块:

public class RepositoryModule : NinjectModule
{
    public override void Load()
    {
        Bind(typeof(IRepository<>)).To(typeof(Repository<>));
    }
}

但是,这只是向我抛出“System.MissingMethodException:没有为此对象定义无参数构造函数。”当我尝试渲染索引视图时。

如果我再添加:

public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { }

所以我实际上的 TestController 看起来像:

public class TestController : Controller
{       
    public IRepository<CustomerModel> rep;

    public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { }

    public TestController(IRepository<CustomerModel> repository)
    {
        this.rep = repository;
    }

    public ActionResult Index()
    {
        return View();
    }
}

它有效,但正如您所见,新的构造函数几乎打破了 IoC 的全部要点。

我该如何解决这个问题?

提前致谢。

【问题讨论】:

  • 你使用的是什么控制器工厂实现?
  • 我只是在使用常规的 MVC 控制器工厂实现。我读到您可以创建一个自定义控制器工厂来解决此问题,但是我只能找到人们使用 Structuremap 的示例...

标签: c# asp.net-mvc ioc-container ninject


【解决方案1】:

您需要更改控制器工厂,因为常规 MVC 控制器工厂不进行 DI。

您可以在此处查看有关如何设置 MVC + Ninject 的更多信息:MVC3 + Ninject - How to?

【讨论】:

  • 这并不能解决我的问题,因为我遇到的问题类型不同,与该帖子无关。
  • 对不起,我可能不太清楚。如果您不想添加无参数构造函数,则应将控制器工厂更改为使用 Ninject 进行依赖注入的工厂。添加一个相当容易,因为 Ninject 团队提供了一个。你可以得到下载和说明here
  • 嗯...在您提供的链接中找不到任何控制器工厂 o:o(至少不适用于 MVC3)
  • 全部由 NinjectHttpApplication 类处理。通过单击“下载”->“下载包”,为您的 ASP.NET 版本(3.5 或 4)下载包。添加 DLL 作为对 MVC 项目的引用。按照instructions 启用Ninject。希望对您有所帮助!
【解决方案2】:

事实证明,不是控制器搞砸了,而是 Ninject 没有正确绑定我的通用存储库和 IRepository - 因此我创建了一个新帖子:Ninject + Bind generic repository

【讨论】:

    【解决方案3】:

    一个简短的测试表明,MVC3 扩展中的泛型绑定没有问题。我想问题不在控制器上,而是无法创建存储库,因为它有一些未知的依赖关系。

    但这让我稍微改变了依赖解析器,以便在可以解析请求的类型但无法解析其中一个依赖项时显示 Ninject 堆栈跟踪。在构建服务器上更新到最新版本以获得更好的堆栈跟踪。

    【讨论】:

      【解决方案4】:

      不要使用这个绑定!!!

      绑定(typeof(IRepository)).To(typeof(Repository));

      我使用此绑定更改了我的代码,但服务器崩溃了,它适用于一个用户,但对于数千个请求,它真的很糟糕

      使用

      Bind(typeof(IRepository<IClass>)).To(typeof(Repository<Class>))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-06
        • 2015-09-26
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多