我创建了一个使用MVC5 / EF6的网站,并使用Ninject作为DI容器将它绑定在一起。
一切正常,除了在一个页面上,我同时进行2个ajax调用。
控制器/存储库吐出各种错误,例如:
“mscorlib.dll中出现'System.Data.Entity.Core.EntityException'类型的第一次机会异常。附加信息:基础提供程序在打开时失败。”
对api的一次调用将始终有效,第二次间歇性地进行。如果我直接在控制器中创建datacontext,它一切正常,所以错误必须与Ninject有关,但我无法解决我需要做什么来排序它。将范围改为Transient / Thread只会改变错误。
任何帮助都非常感激。
这是我的(编辑过的)代码:
从Global.asax Application_Start()
调用var context = new myDataContext();
// Lowest down wins
IKernel kernel = new StandardKernel();
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
GlobalConfiguration.Configuration.DependencyResolver
= new App_Start.NinjectResolver(kernel);
kernel.Bind<IRepository<Models.MyClass>>()
.To<MyRepository>()
//.InTransientScope()
//.InThreadScope()
.InRequestScope()
.WithConstructorArgument("context", context);
Api控制器
public class MyApiController : ApiController
{
IRepository<MyRepository> _repository;
public EMAAFController(IRepository<MyRepository> repository)
{
_repository = repository;
}
public IEnumerable<Models.MyClass> Get(int id)
{
var itemToReturn = _repository.GetAll().Where(i => i.id == id).ToList();
return itemToReturn;
}
}
答案 0 :(得分:2)
你做错了。绑定在应用程序启动时完成,在您的情况下,您创建上下文实例并将其路径绑定到
将您的绑定更改为
kernel.Bind<myDataContext>().ToSelf().InRequestScope();
kernel.Bind<IRepository<Models.MyClass>>().To<MyRepository>().InRequestScope()
因此,当ninject将解析您的存储库时,它将看到带有输入参数myDataContext的构造函数,并将了解如何获取上下文