我有一系列订单。我想访问数据库一次,检索订单,存储它们,然后能够通过多个表单访问这个集合。我知道在 asp.net 中,您可以使用 Application Object 或 Session Object 之类的东西,但是您如何在 win 表单应用程序中做到这一点?我正在考虑创建一个可以通过多个表单、类或任何地方访问的静态集合。这听起来对吗,甚至可行吗?
谢谢
我有一系列订单。我想访问数据库一次,检索订单,存储它们,然后能够通过多个表单访问这个集合。我知道在 asp.net 中,您可以使用 Application Object 或 Session Object 之类的东西,但是您如何在 win 表单应用程序中做到这一点?我正在考虑创建一个可以通过多个表单、类或任何地方访问的静态集合。这听起来对吗,甚至可行吗?
谢谢
WebForms 和 WinForms 的根本区别在于 WinForms 是有状态的。换句话说,您可以确保您加载一次的对象在程序关闭之前都可用。WebForms 并非如此,因为 HTTP 是无状态的,而 ASP.Net 编织了许多“魔术”[ViewState、服务器会话、Cookie、隐藏字段等] 来将 Web 应用程序的页面粘合在一起。
有了这种方式的基本概念,就很容易使对象在 WinForms 中全局可用。使用 Singleton / Static 类并分配其成员。您总是可以说 .Instance.. [在静态类/具有静态属性的类的情况下] 从任何表单中检索值。
一个问题是“线程安全”……又名……多个表单同时读取/写入静态属性。如果你能照顾好这个,休息是轻而易举的事。
对于您的上述问题:
您可以拥有自己的 Singleton Cache 类来缓存记录。Cache 类将是一个自定义集合实现。您需要确保它是线程安全的[或确保您的应用程序只加载一次并从那时起读取]...如果您希望对数据库的更改反映在实体对象中,您可能需要考虑一个成熟的 ORM .
CacheList.OrderCache[orderNo].Customer.Address.City = "Las Vegas";
class static CacheList
{
public static Cache OrderCache {get; internal set;}
}
public class Cache : CollectionBase where T : Entity
{
.....
}
无论如何,您应该有一些访问数据库的数据对象,对吧?将其包装在一个 CacheProxy 类中,如果它没有本地副本,它将命中数据库。我听说你也可以在 Winforms 中使用 System.Web 缓存。