如何处理共享库的不同Ninject范围?

时间:2013-07-15 01:02:21

标签: asp.net-mvc entity-framework ninject

我有一个使用Entity Framework(DbContext)的共享库。该库用于普通的Windows应用程序以及Web MVC项目。我使用Ninject作为DI。

根据我的理解,我应该在InThreadScope上使用DbContext用于Windows应用程序,InRequestScope用于MVC项目。

然而,这会产生一些不需要的依赖关系。我的共享库需要引用System.Web(用于请求范围)。或者我的web项目需要EF的引用(所以我可以改变范围)。

是否可以以这种方式设置Ninject以避免这些依赖?

3 个答案:

答案 0 :(得分:0)

我建议创建一个像 NinjectModules 这样的新项目。将绑定声明移动到单独的模块中,如 WinAppModule MvcModule ,并将其放入 NinjectModules 项目中。然后从win app项目和mvc项目中引用 NinjectModules 。他们不再需要引用EF和System.Web

<强>更新

Modules diagram 您可以在类似问题上看到我的answer

答案 1 :(得分:0)

好的,我做了一个绘图: moving the binding dependency to the intermediary 通常,人们会像UnitOfWork一样使用“数据库会话”的某种表示。 因此,如果您的共享库“SomeLib”提供IUnitOfWork来表示会话,您可以在应用程序中创建1:1绑定IUnitOfWork:DbContext @ SomeLib和更具体的绑定。

答案 2 :(得分:0)

另一种可能的解决方案是:

在SomeLib中定义DbContext的绑定,如下所示:

this.Bind<DbContext>().ToSelf()
    .InScope(ctx => ctx.Kernel.Get<IDbContextScopeRetriever>().Retrieve());`

using a scope retriever 然后在应用程序中创建并绑定IDbContextScopeRetriever的相应实现。

ThreadDbContextScopeRetriever的实施可能是:

object Retrieve() {
    return System.Threading.Current;
}