我有一个存储库层,它将DbContext带入构造函数。我正在使用InCallScope,但dbcontext实例在存储库中似乎有所不同。这是代码:
Bind<DbContext>().ToMethod(ctx =>new TaCertoEntities()).InCallScope();
Bind<IContratacaoRepository>().To<ContratacaoRepository>();
using (var context = Ioc.Container.Get<DbContext>())
{
Ioc.Container.Get<IContratacaoRepository>().Insert(xxx);
context.Save();
}
我做错了什么?
谢谢!
答案 0 :(得分:4)
每当您使用此IoC.Container.Get<T>
向内核询问服务时,如果您使用InCallScope()
,则会获得不同的实例。这就是你做错了。
您应该避免使用此Service Locator anti-pattern。您遇到的这种症状显然是这种反模式的一个副作用:您不知道组合根的位置。
如果不确定你的作品根,那么使用作用域就会变得毫无用处。每当您需要依赖时,通过服务定位器询问新实例时,内核无法猜测如何解析范围,您必然会遇到此类问题。
如果您使用的是MVC / WebAPI应用程序,您的控制器肯定会成为对象图的激活点,因为它的依赖关系将被注入。但你必须把它留给Ninject做那件事。
Nuget包 Ninject.MVC3 会自动配置您的Web应用程序以进行注入。或者,如果您没有使用Web应用程序,请提供更多示例代码,以便我可以帮助您确定组合根目录以及范围如何帮助您解决您所面临的问题。