Asp.net mvc 如何为共享库处理不同的Ninject作用域?

Asp.net mvc 如何为共享库处理不同的Ninject作用域?,asp.net-mvc,entity-framework,ninject,Asp.net Mvc,Entity Framework,Ninject,我有一个使用实体框架(DbContext)的共享库。此库用于普通windows应用程序以及web MVC项目。我使用Ninject作为DI 据我所知,我应该在Windows应用程序的DbContext上使用InThreadScope,在MVC项目中使用InRequestScope 但是,这会产生一些不需要的依赖项。我的共享库需要引用System.Web(用于请求范围)。或者我的web项目需要引用EF(这样我可以更改范围) 是否可以以这种方式设置Ninject以避免这些依赖关系 我建议创建一个像N

我有一个使用实体框架(DbContext)的共享库。此库用于普通windows应用程序以及web MVC项目。我使用Ninject作为DI

据我所知,我应该在Windows应用程序的
DbContext
上使用
InThreadScope
,在MVC项目中使用
InRequestScope

但是,这会产生一些不需要的依赖项。我的共享库需要引用
System.Web
(用于请求范围)。或者我的web项目需要引用EF(这样我可以更改范围)


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

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

更新

你可以看到我对类似问题的回答。

好的,我画了一张图: 通常情况下,人们使用“数据库会话”的某种表示形式,如UnitOfWork。
因此,如果您的共享库“SomeLib”提供了表示会话的IUnitOfWork,您可以在应用程序中创建1:1绑定IUnitOfWork:DbContext@SomeLib和更具体的绑定。

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

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

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

因此,我认为您的应用程序不直接需要DbContext。他们引用的是使用DbContext的什么?抱歉,这是我想要编辑我的评论的内容(但被打断):如果(线程/请求):Dependency:DbContext之间存在1:1:1关系,您还可以定义Dependency:DbContext@shared library和Thread:Dependency@WinApp和Request:Dependency WebApp之间的范围约束。这不需要任何额外的项目或参考。但这只有在涉及某种1:…:1…:1依赖关系的情况下才可能实现。我尝试过类似的方法,将作用域lamba直接传递给NinjectModule。除了InRequestScope的作用域lamba是私有的之外,这一切都很好。Ofc我可以撕毁它的实现,但这种黑客行为无法达到目的。是的,你完全正确。我不知道InRequestScope有多复杂(目前无法从这里访问github web),所以我认为这可能比有一个不需要的引用更糟糕。(如答案所示,InThreadScope非常简单)。如何仅绑定接口?还是建议在UnitOfWork包装器中包装DbContext?这不是有同样的问题吗?是的,基本上我建议在UnitOfWork中包装DbContext。只要UnitOfWork:IUnitOfWork的接口不包含任何与EF库相关的内容,您就不需要对其进行引用。然而,由于我不熟悉EF,我不知道这样做是否合适。两个单独的程序集,每一行代码?不要以为我的身体会让我输入那个代码。不,只是ninject模块绑定声明的一个附加程序集。我添加了图表来帮助您理解。请记住,您不应该在库项目中声明IOC绑定(库的用户应该决定使用哪些绑定。这样,您还可以独立于IOC容器实现(依赖性将仅在最顶层的项目中声明)。不同意。在库项目中使用IOC是完全可以的。通常不需要向调用项目公开内部功能。我所要寻找的只是一种将范围对象传递到库的方法。现在可以肯定的是,这在Ninject中是不可能的。
object Retrieve() {
    return System.Threading.Current;
}