1

我知道已经讨论了有关该主题的几个主题,因为我一直在阅读很多内容以尝试解决我的问题,但不知何故它们碰巧不能满足我的需求(可能是因为缺乏细节)。无论如何,如果您认为某些特定的“主题”可能有用,请链接它。

我正在使用 WPF(和 MVVM)开发桌面应用程序,并且正在使用 NHibernate。在研究了管理会话的可能方法后,我决定使用每表单会话的方法。通过这种方式,我想我可以充分利用 NHibernate 的延迟加载、缓存等特性。当我使用数据库时,我不想在加载或保存我的实体时冻结我的 UI,所以我认为我应该使用专用线程(在每种形式中,我认为这可以简化开发)处理数据库交互。但是,问题是我应该如何“重用”线程(假设我有一个与该线程关联的会话)来进行“数据库调用”。

  • 我想我不能使用 TPL,因为我不能保证这两个任务会在同一个线程中运行(甚至不能保证它们会在与调用者不同的线程中运行)
  • 我更喜欢使用 session-per-form,因为我已经看到类似的讨论以使用 session-per-conversation 或类似的方式结束。但是无论如何,如果您发现每次会话会话会更好,请告诉我(并希望解释原因)
  • 线程不提供直接运行多个方法的方法,所以我认为我必须“监听”请求,但我仍然不确定我是否真的必须这样做以及如何“使用”会话(并保存)仅在线程内。

编辑:也许我遇到了这个问题,因为我将线程安全与其他东西混淆了。当 NHibernate 文档说 ISession 实例不是线程安全的时,这是否意味着如果两个线程同时尝试使用它,我会(或可能)遇到麻烦对吗?就我而言,如果我使用 TPL,不同的线程可以使用同一个会话,但我不会同时在同一个会话中执行多个操作。那么,在那种情况下我会遇到麻烦吗?

4

1 回答 1

0

如果我可以提出建议,桌面应用程序不太适合直接与数据库交互。通信没有加密,即使是最有知识的人也很容易获取数据库密码并开始使用 SQL 连接弄乱记录并破坏您的数据库。

最好在桌面应用程序和数据库之间创建一个具有身份验证的 Web 服务,因为您可以为每个人创建凭据,并且每笔交易都将强制遵守您的各种业务规则。

这也将解决您的线程问题,因为您将能够在另一个线程上创建 HTTP 连接,而会话管理几乎没有问题。一个 cookie 值可能就是所有需要的,而 RestSharp 使这变得相当简单。

于 2012-12-15T21:56:13.867 回答