winforms - 如何在 Windows 窗体中使用 DbContext 实现 DI

标签 winforms dependency-injection ef-code-first

我有一个类在使用 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/

相关文章:

c# - 如何在TextBox中实现自定义撤销

.net - 在 .Net 中选择打印机

c++ - 从服务以交互方式启动 .Net winforms 应用程序

c# - ef core - 如何将类映射的多个变体映射到同一个表

c# - SQL to Linq语句中的独立子查询(只命中一次DB)

c# - Entity Framework 6 mysql rowversion

c# - 使用 WebBrowser 控件时如何获得网站图标?

php - Silex 服务 - $app 参数或 "use ($app)"语句?

javascript - 这是在 Node 中进行依赖注入(inject)的正确方法吗?

c# - asp.net MVC - 如何通过不同的存储库类共享同一个 SqlConnection 实例