在使用Ninject的构造函数依赖注入时如何重新注入EF上下文?

时间:2014-05-13 08:03:06

标签: asp.net-mvc dependency-injection ninject

我在Ninject的帮助下通过构造函数注入所有依赖项(服务,上下文)。所有依赖项的范围都适用于当前请求。一切正常,但现在我想在某些情况下刷新/重建Entity Framework上下文。所以基本上我只想重新注入依赖项。

我可以注入一个UnitofWork并在其上调用一些方法来重新创建上下文。对于Entity Framework,这意味着创建另一个上下文。但是我想知道Ninject是否会意识到这一点以及如果我还需要在同一个请求中使用上下文会发生什么 - 它会使用旧的还是新的上下文?

2 个答案:

答案 0 :(得分:1)

据我所知,ninject没有提供您特别需要的实现。

在您的情况下,客户端代码可以明确地控制'DTContext'的生命周期。而不是注入'DTContext',你会注入一个'IDbContextFactory'。您需要将db上下文传递给需要相同实例的每个人。

我曾经在一个相当复杂的SW上工作过,就像这样。 然而,我们更进了一步:作为一种促进,我们将工作单元(DataContext)存储在'ThreadLocal'中。这限制了您的软件,因为您无法跨多个线程共享工作单元。然而,这通常是你不应该做的事情,因为交易应该尽可能短。

这样做的好处是,您不需要一直传递工作单元引用,而是创建一个可以自由注入的适配器,以及在需要时用于访问当前ThreadLocal值的适配器。访问工作单元。 但是,您仍然需要明确控制工作单元的生命周期。所以你仍然需要工厂来实现工作单元并将其分配给'ThreadLocal'。在工作单元结束时,您提交或回滚,然后重置'ThreadLocal'。

另见这个答案,其中还包含代码: How to use Ninject in a multi-threaded Windows service to get new instances of a dependency (DbContext) on every tick?

答案 1 :(得分:1)

听起来你需要注入一个DbContext工厂类,或者你可以注入一个Func< DbContext>并让Ninject将其解析为一种方法。