我在使用EF Code First的winforms应用程序中运行一个类。 DbContext是通过类构造函数通过DI创建的。一切正常。
问题在于,所引用的数据也正在通过网站进行修改,使用与EF Code First相同的DI模式,并且数据更改未反映在winforms应用程序的上下文实例中。
我可以通过在每次访问Winforms中重新创建DbContext对象来解决此问题,但是对我来说,这似乎更像是一种服务位置模式?
是否有真正的DI技术来实现这一目标?
还是应该从DI中删除上下文并使用服务位置?
最佳答案
您是否对其他问题的答案感到不满意(http://stackoverflow.com/questions/7657643/how-to-force-ef-code-first-to-query-the-database),该问题建议使用Detach,AsNoTracking或覆盖更改?
1)也许您可以传递一个能够创建DbContext的接口,而不是上下文本身。
using(var context = _contextFactory.Create()) {
var entity = from table in context.Blah...;
}
Create方法可以自己创建具体的类(稍微破坏DI模式),也可以使用服务位置为其创建一个具体类。并不是很好,但是比将服务位置调用嵌入到各处更好,并且仍然意味着您可以自己控制生命周期。
2)将WinForm更改为从网站运行的Web服务读取,实际上类似于禁用缓存。
3)在MVC的最深处(不是那么深),它直接引用DI容器并将其用作服务定位符,以作为新创建对象的参数传递。从技术上讲,您可以在WinForms中执行类似的操作,但需要将应用程序拆分为寿命不长的小块(控制器)。也许值得一看WinForms的一些MVC / MVP框架,尽管我发现自己对快速谷歌的使用最多。
关于winforms - 如何在Windows窗体中使用DbContext实现DI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7658225/