2014-09-01 75 views
2

我们正在使用Prism和Ninject创建一个桌面MVVM应用程序。这个应用程序将具有特定会话期间记录数据的会话。我们的Views和ViewModels是由Prism的IoC容器创建的。我想开始和停止会话,但我不知道如何处理桌面应用程序的DAL等部分的范围。在桌面应用程序中管理Ninject范围

我是在朝着正确的方向思考还是应该以不同的方式思考?我想我可以通过Prism中的导航参数或使用PubSubEvents messagebus广播会话事件来传递会话ID,但这似乎是错误的。

+1

是否只有一个用户一次使用应用程序实例?如果是这样你*可以*使用自定义作用域('.InScope(...)')。但是,如果你只有一些管理当前会话状态('.Start()','.Stop()','.CurrentSessionId' ...)的单身'SessionManager',也许会更好。这样你就不需要重新创建对象图的一部分,而只需要管理状态。需要知道当前会话的任何组件只是询问“ISessionManager”。 – BatteryBackupUnit 2014-09-03 05:30:08

+0

这似乎是一个不错的解决方案。我可以让SessionManager注入必要的工厂,为任何感兴趣的人生成会话相关数据服务。 – Wouter 2014-09-04 08:13:36

+0

我仍然对如何处理桌面应用程序中的IoC范围感兴趣。 Web开发人员似乎对每个请求范围都很容易。 – Wouter 2014-09-04 08:14:26

回答

0

通常,网络术语中的“会话”可以等同于“工作单元”。我希望你试图在你的桌面应用程序中达到同样的范围。

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

据我所知,Ninject支持每个网络请求会话,通过缓存一个给定用户的对象的持续时间,通过一些钩住编程魔术来处理他们的请求。

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

不幸的是,我没有全面的解决方案给你,但希望能让你走上正确的道路。

1

在桌面应用程序中使用IoC容器时,您没有在Web应用程序中使用的Scope。每个WebRequest或每个会话的作用域不可用。

所以你必须使用另一种类型的范围,如pero线程范围。或者,如果您有特殊要求,您可以创建自定义范围,以便决定何时启动以及何时完成。 https://github.com/ninject/ninject/wiki/Object-Scopes