winforms - WinForms 的 NHibernate 设计

标签 winforms nhibernate design-patterns fluent-nhibernate

我应该如何拥有 NHibernate Session Factory 和 WinForms 应用程序的 session ?

SessionFactory 应该是单例吗?或者我可以每次都创建它吗? session 和交易怎么样?

如有任何帮助,我们将不胜感激。谢谢

最佳答案

session 工厂应该是单例,因为创建它的成本很高。它是线程安全的,因此使用它不存在线程问题。

我在 winforms 应用程序中使用了每次对话 session 模式,并且发现它运行良好。通过此模式,您可以使用同一个 session 来执行一系列属于一起的操作。在我看来,winforms 应用程序中的对话可以粗略地映射到应用程序中的 GUI 操作。

为每个 GUI 操作使用新 session 有助于保持 session 足够小,以避免一级缓存中的许多实体出现性能问题,同时避免为每个操作使用单独的 session ,这也可能导致性能问题。

要实现此目的,您需要在处理 GUI 命令之前创建一个新 session ,并在处理该命令后释放该 session 。下面是一个例子,它使用一个类(PersistenceContext),该类在实例化时创建 session ,并在释放 session 时释放该 session 。然后,此类可以创建使用当前 session 的存储库。

public void SomeGuiEvent(...)
{
    using (var context = new PersistenceContext())
    {
        ProcessStuff(context);
    }
}

当然还有许多其他选项可以实现这一点,但是无论您选择如何实现它,我都可以推荐在 Winforms 应用程序中使用 NHibernate 时使用“Session-per-conversation”模式。

关于winforms - WinForms 的 NHibernate 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2153124/

相关文章:

c# - Doublebuffer winforms 面板问题

string - 如何将枚举映射为数据库中的字符串

c# - 泛型或非泛型类上的静态工厂方法?

NHibernate 映射不起作用

java - Java个人项目,如何访问数据库?

design-patterns - 服务定位器模式与抽象工厂模式有什么不同吗?

c# - 删除窗口的标题栏文本但保留状态栏文本

c# - 动态上下文菜单

c# - 显卡适配器的 PNPDeviceID 是否唯一?

c# - 使用 Fluent NHibernate 映射树结构