Asp.net mvc 在Ninject中使用构造函数依赖项注入时,如何重新注入EF上下文?
我在Ninject的帮助下通过构造函数注入所有依赖项(服务、上下文)。所有依赖项的范围都适用于当前请求。一切正常,但现在我想在某些情况下刷新/重建实体框架上下文。所以基本上我只想重新注入依赖项Asp.net mvc 在Ninject中使用构造函数依赖项注入时,如何重新注入EF上下文?,asp.net-mvc,dependency-injection,ninject,Asp.net Mvc,Dependency Injection,Ninject,我在Ninject的帮助下通过构造函数注入所有依赖项(服务、上下文)。所有依赖项的范围都适用于当前请求。一切正常,但现在我想在某些情况下刷新/重建实体框架上下文。所以基本上我只想重新注入依赖项 我可以注入UnitofWork并对其调用一些方法来重新生成上下文。对于实体框架,这意味着创建另一个上下文。但我想知道Ninject是否会意识到这一点,如果我在同一请求中进一步需要使用上下文,会发生什么情况?它会使用旧的还是新的上下文?据我所知,Ninject没有为您具体需要的内容提供实现 在您的情况下,客
我可以注入UnitofWork并对其调用一些方法来重新生成上下文。对于实体框架,这意味着创建另一个上下文。但我想知道Ninject是否会意识到这一点,如果我在同一请求中进一步需要使用上下文,会发生什么情况?它会使用旧的还是新的上下文?据我所知,Ninject没有为您具体需要的内容提供实现 在您的情况下,客户端代码显式地控制“DbContext”的生命周期可能是有意义的。您将注入一个“IDbContextFactory”,而不是注入“DbContext”。您需要将db上下文传递给需要相同实例的所有人 我在一个相当复杂的软件上工作过,就是这样做的。 然而,我们更进一步:为了方便起见,我们将工作单元(
DataContext
)存储在“ThreadLocal”中。这限制了您的软件,因为您不能跨多个线程共享工作单元。然而,这通常是无论如何都不应该做的事情,因为事务应该尽可能短
这样做的好处是,您不需要一直传递工作单元引用,相反,您可以创建一个适配器,您可以自由注入该适配器,并在需要访问工作单元时使用该适配器访问当前ThreadLocal的值。
不过,您仍然需要显式地控制工作单元的生命周期。因此,您仍然需要工厂,它将实例化工作单元并将其分配给“ThreadLocal”。在工作单元结束时,提交或回滚,然后重置“ThreadLocal”
另请参见此答案,其中也包含代码:
听起来你要么需要注入一个DbContext工厂类,要么可以注入一个Func