我有一个使用Entity Framework(DbContext)的共享库。该库用于普通的Windows应用程序以及Web MVC项目。我使用Ninject作为DI。
根据我的理解,我应该在InThreadScope
上使用DbContext
用于Windows应用程序,InRequestScope
用于MVC项目。
然而,这会产生一些不需要的依赖关系。我的共享库需要引用System.Web
(用于请求范围)。或者我的web项目需要EF的引用(所以我可以改变范围)。
是否可以以这种方式设置Ninject以避免这些依赖?
答案 0 :(得分:0)
我建议创建一个像 NinjectModules 这样的新项目。将绑定声明移动到单独的模块中,如 WinAppModule , MvcModule ,并将其放入 NinjectModules 项目中。然后从win app项目和mvc项目中引用 NinjectModules 。他们不再需要引用EF和System.Web
。
<强>更新强>
您可以在类似问题上看到我的answer。
答案 1 :(得分:0)
好的,我做了一个绘图: 通常,人们会像UnitOfWork一样使用“数据库会话”的某种表示。 因此,如果您的共享库“SomeLib”提供IUnitOfWork来表示会话,您可以在应用程序中创建1:1绑定IUnitOfWork:DbContext @ SomeLib和更具体的绑定。
答案 2 :(得分:0)
另一种可能的解决方案是:
在SomeLib中定义DbContext的绑定,如下所示:
this.Bind<DbContext>().ToSelf()
.InScope(ctx => ctx.Kernel.Get<IDbContextScopeRetriever>().Retrieve());`
然后在应用程序中创建并绑定IDbContextScopeRetriever
的相应实现。
ThreadDbContextScopeRetriever
的实施可能是:
object Retrieve() {
return System.Threading.Current;
}