1

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

这是我的理解,我应该在InThreadScopeWindowsDbContext应用程序和InRequestScopeMVC 项目中使用。

然而,这会创建一些不需要的依赖项。我的共享库需要引用System.Web(用于请求范围)。或者我的 Web 项目需要对 EF 的引用(这样我就可以更改范围)。

是否可以设置 Ninject 以避免这些依赖关系?

4

3 回答 3

0

好的,所以我画了一张图: 将绑定依赖转移到中介 经常有人使用“数据库会话”的某种表示形式,例如 UnitOfWork。因此,如果您的共享库“SomeLib”提供 IUnitOfWork 来表示会话,您可能会在应用程序中创建 1:1 绑定 IUnitOfWork:DbContext @ SomeLib 和更具体的绑定。

于 2013-07-16T14:38:41.517 回答
0

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

在 SomeLib 中定义 DbContext 的绑定如下:

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

使用范围检索器IDbContextScopeRetriever然后在您的应用程序中 创建并绑定相应的实现。

的实现ThreadDbContextScopeRetriever可能是:

object Retrieve() {
    return System.Threading.Current;
}
于 2013-07-16T14:49:25.443 回答
0

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

更新

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

于 2013-07-16T07:34:24.587 回答