MVC3控制器构造函数+ Ninject

3
我现在正在开发一个MVC3 Web应用程序,遇到了Ninject的一个新问题。
我在我的控制器中使用以下代码:
public class TestController : Controller
{       
    public IRepository<CustomerModel> rep;

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

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

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

然而,当我尝试呈现Index视图时,它只是抛出了“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的整个重点。
我该如何修复这个问题?
提前致谢。

你使用的是哪种控制器工厂实现? - Mauricio Scheffer
我只是使用普通的MVC控制器工厂实现。我读到过可以制作自定义控制器工厂来解决这个问题,但是我只能找到人们使用Structuremap的例子... - ebb
请查看以下链接:http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ - Mauricio Scheffer
4个回答

4

一个简短的测试显示MVC3扩展中的通用绑定没有问题。我猜问题不在控制器上,而是存储库无法创建,因为它具有某些未知的依赖关系。

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


2

你需要更改控制器工厂,因为常规的 MVC 控制器工厂不支持 DI。

如果你想了解如何设置 MVC + Ninject,请参考这里:MVC3 + Ninject - 如何做?


那并不能解决我的问题,因为我遇到的问题是不同类型的,与那篇文章无关。 - ebb
抱歉,也许我表达不够清晰。如果您不想添加一个无参数构造函数,您应该将控制器工厂更改为使用Ninject进行依赖注入的工厂。 添加一个工厂非常容易,因为Ninject团队提供了一个工厂。您可以在此处获取下载和说明:https://github.com/ninject/ninject.web.mvc - CGK
哦,看起来在你提供的链接中找不到任何控制器工厂 o:o(至少不适用于MVC3)。 - ebb
所有这些都由NinjectHttpApplication类处理。点击下载->下载软件包,为您的ASP.NET版本(3.5或4)下载软件包。将DLL作为引用添加到您的MVC项目中。请按照说明启用Ninject。希望这可以帮助到您! - CGK

2

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


0

不要使用这个绑定!!!

Bind(typeof(IRepository<>)).To(typeof(Repository<>));

我更改了我的代码使用这个绑定,结果服务器崩溃了。虽然对于一个用户来说它可以工作,但是对于成千上万的请求来说,效果真的很糟糕。

使用方法

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接