Ninject - 实体框架 - 运行时更改上下文

时间:2013-05-01 17:43:05

标签: entity-framework ninject azure-sql-database sql-azure-federations

我们在这里有一种有趣的情况。我们将存储库模式与Entity Framework一起使用,因此每个数据库表都有自己的Repository类,在其构造函数中接受DbContext的实例。我们也使用Ninject进行依赖注入。我们已经定义了一个在给定请求期间实例化的上下文,以便当多个存储库请求DbContext时,始终使用相同的实例。这允许我们遵循UnitOfWork模式,因此多个存储库上可以发生多个事情,并且单个提交将提交对数据库的所有更改。

问题在于,我们还使用SQL Azure Federations将客户端数据拆分为多个数据库(分片)。我们需要能够在同一个请求中从一个联盟成员(数据库)跳转到另一个联盟成员(数据库),但希望能够使用依赖于注入的上下文的相同服务/存储库方法。我们的第一个想法是在现有的上下文中执行USE FEDERATION sql命令以移动到下一个数据库但它似乎有时工作而不是其他数据库。在执行语句之后,我们看到上下文中的底层连接确实指向新服务器,但由于某种原因,在该上下文上执行的查询最终返回先前连接的结果。我假设在多个数据库上使用相同的上下文实例并不是真正支持的东西,因为在连接到新数据库时通常会启动新的上下文。不幸的是,我们有一堆使用Ninject动态创建的存储库,然后接收相同的上下文实例,所以即使我们为新数据库启动新的上下文,我们也无法使所有现有的存储库突然变为依赖于新的上下文,我们只是旋转而不是在初始请求时创建的那个。

以下是我们可以想到的一些解决方案,但不确定如何让它们起作用:

  1. 更改现有上下文中使用的数据库(如上所述,但似乎不起作用)
  2. 使用新的存储库交换所有存储库的注入上下文,以便所有现有存储库现在依赖于不同的上下文
  3. 以某种方式请求来自Ninject的所有存储库的新实例在请求后传递上下文所需的参数。
  4. 同样,这里的底线是我们有一组依赖于单个Context的存储库和服务,我们希望能够重用这些服务和存储库,但是交换或更改所有依赖的上下文,指向新服务器。

1 个答案:

答案 0 :(得分:0)

解决方案是让Ninject完全退出场景。不是最好的解决方案,但我们使用的工具并非真正用于在我们工作的环境中做我们想要的工作。