【问题标题】:Manage Ninject scope for sessions in a desktop application管理桌面应用程序中会话的 Ninject 范围
【发布时间】:2014-09-01 10:22:36
【问题描述】:

我们正在使用 Prism 和 Ninject 创建桌面 MVVM 应用程序。此应用程序将提供会话,在这些会话期间应在特定会话下记录数据。我们的视图和视图模型由 Prism 的 IoC 容器创建。我想启动和停止会话,但我不知道如何处理桌面应用程序的 DAL 等部分的范围。

我的想法是正确的,还是应该换个角度思考?我想我可以通过 Prism 中的导航参数传递会话 ID,或者使用 PubSubEvents 消息总线广播会话事件,但这似乎是错误的。

【问题讨论】:

  • 一次是否只有一个用户使用应用程序实例?如果是这样,您可以使用自定义范围 (.InScope(...))。但如果你有一些单例SessionManager 来管理当前会话状态(.Start().Stop().CurrentSessionId...),也许会更好。这样您就不需要重新创建对象图的一部分,而只需管理状态。任何需要知道当前会话的组件只需询问ISessionManager
  • 这似乎是一个不错的解决方案。我可以让 SessionManager 注入必要的工厂,以便为任何感兴趣的人生成会话相关的数据服务。
  • 我仍然对如何在桌面应用程序中处理 IoC 范围感兴趣。 Web 开发人员似乎可以轻松处理每个请求的范围。
  • 我不太明白你想要达到什么目的。使用桌面应用程序,只能同时有一个用户,对吧?那么你需要什么样的范围呢? Ninject 提供了几种方法来设计您自己的作用域,例如参见github.com/ninject/ninject.extensions.namedscope/wiki
  • 正如我所说的会话范围。也许我只是不了解 IoC 范围的用例,并尝试应用它们来解决错误的事情。

标签: c# mvvm ninject inversion-of-control prism


【解决方案1】:

当您在桌面应用程序中使用 IoC 容器时,您没有 Web 应用程序中的范围。每个 WebRequest 或每个 Session 的范围不可用。

所以你必须使用另一种范围,比如 pero Thread Scope。或者,如果您有特殊要求,您可以创建自定义范围,以便您决定何时开始和何时结束。 https://github.com/ninject/ninject/wiki/Object-Scopes

【讨论】:

    【解决方案2】:

    通常,网络术语中的“会话”可以视为等同于“工作单元”。我希望您尝试在桌面应用程序中实现相同级别的范围。

    如果是这样,您需要定义您认为对单个工作单元的准确衡量标准。在网络世界中,它可以被认为是从用户请求进入(即点击提交按钮)到返回结果(即更新屏幕)之间发生的所有事情。

    据我所知,Ninject 支持 Web 中的每个请求会话,方法是在给定用户的请求期间缓存给定用户的对象,这些对象是通过一些程序化魔法挂钩的。

    如果您决定将相同的会话度量应用于桌面应用程序,那么您将需要引入一个层,该层会在任何用户页面交互时触发会话开始,并在反馈给他们的结果时结束会话。

    很遗憾,我没有为您提供包罗万象的解决方案,但希望这能让您走上正确的道路。

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 2016-01-19
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2011-02-06
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多