Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在Ninject中使用构造函数依赖项注入时,如何重新注入EF上下文?_Asp.net Mvc_Dependency Injection_Ninject - Fatal编程技术网

Asp.net mvc 在Ninject中使用构造函数依赖项注入时,如何重新注入EF上下文?

Asp.net mvc 在Ninject中使用构造函数依赖项注入时,如何重新注入EF上下文?,asp.net-mvc,dependency-injection,ninject,Asp.net Mvc,Dependency Injection,Ninject,我在Ninject的帮助下通过构造函数注入所有依赖项(服务、上下文)。所有依赖项的范围都适用于当前请求。一切正常,但现在我想在某些情况下刷新/重建实体框架上下文。所以基本上我只想重新注入依赖项 我可以注入UnitofWork并对其调用一些方法来重新生成上下文。对于实体框架,这意味着创建另一个上下文。但我想知道Ninject是否会意识到这一点,如果我在同一请求中进一步需要使用上下文,会发生什么情况?它会使用旧的还是新的上下文?据我所知,Ninject没有为您具体需要的内容提供实现 在您的情况下,客

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


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

据我所知,Ninject没有为您具体需要的内容提供实现

在您的情况下,客户端代码显式地控制“DbContext”的生命周期可能是有意义的。您将注入一个“IDbContextFactory”,而不是注入“DbContext”。您需要将db上下文传递给需要相同实例的所有人

我在一个相当复杂的软件上工作过,就是这样做的。 然而,我们更进一步:为了方便起见,我们将工作单元(
DataContext
)存储在“ThreadLocal”中。这限制了您的软件,因为您不能跨多个线程共享工作单元。然而,这通常是无论如何都不应该做的事情,因为事务应该尽可能短

这样做的好处是,您不需要一直传递工作单元引用,相反,您可以创建一个适配器,您可以自由注入该适配器,并在需要访问工作单元时使用该适配器访问当前ThreadLocal的值。 不过,您仍然需要显式地控制工作单元的生命周期。因此,您仍然需要工厂,它将实例化工作单元并将其分配给“ThreadLocal”。在工作单元结束时,提交或回滚,然后重置“ThreadLocal”

另请参见此答案,其中也包含代码:

听起来你要么需要注入一个DbContext工厂类,要么可以注入一个Func并让Ninject将其作为一个方法来解决。

你能解释一下什么时候需要“刷新”工作单元吗?@Steven:在一个控制器操作中。我问“何时”不是“何处”:-。我的意思是,在什么情况下你需要刷新你的工作单元?