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