MVC3 Controller构造函数+ Ninject

时间:2010-12-06 17:17:51

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

我目前正在开发一个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<>));
    }
}

然而,这只会引发“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的全部要点。

我该如何解决这个问题?

提前致谢。

4 个答案:

答案 0 :(得分:4)

简短测试显示MVC3扩展中的通用绑定没有问题。我猜这个问题不是在Controller中,而是因为它有一些未知的依赖项而无法创建Repository。

但是这使我每次更改依赖项解析器以显示Ninject堆栈跟踪,只要可以解析所请求的类型,但其中一个依赖项无法解析。更新到构建服务器上的最新版本以获得更好的堆栈跟踪。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

不要使用此绑定!!!

  

绑定(typeof运算(IRepository&LT;&GT))向(typeof运算(库&LT;&GT));

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

使用

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