我目前正在开发一个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的全部要点。
我该如何解决这个问题?
提前致谢。
答案 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>))