我們正在使用Prism和Ninject創建一個桌面MVVM應用程序。這個應用程序將具有特定會話期間記錄數據的會話。我們的Views和ViewModels是由Prism的IoC容器創建的。我想開始和停止會話,但我不知道如何處理桌面應用程序的DAL等部分的範圍。在桌面應用程序中管理Ninject範圍
我是在朝着正確的方向思考還是應該以不同的方式思考?我想我可以通過Prism中的導航參數或使用PubSubEvents messagebus廣播會話事件來傳遞會話ID,但這似乎是錯誤的。
我們正在使用Prism和Ninject創建一個桌面MVVM應用程序。這個應用程序將具有特定會話期間記錄數據的會話。我們的Views和ViewModels是由Prism的IoC容器創建的。我想開始和停止會話,但我不知道如何處理桌面應用程序的DAL等部分的範圍。在桌面應用程序中管理Ninject範圍
我是在朝着正確的方向思考還是應該以不同的方式思考?我想我可以通過Prism中的導航參數或使用PubSubEvents messagebus廣播會話事件來傳遞會話ID,但這似乎是錯誤的。
通常,網絡術語中的「會話」可以等同於「工作單元」。我希望你試圖在你的桌面應用程序中達到同樣的範圍。
如果是這樣,您需要定義您認爲是對單個工作單元的準確度量。在網絡世界中,可以認爲在進入用戶請求(即,單擊提交按鈕)與發回的結果(即更新屏幕)之間發生的所有事情。
據我所知,Ninject支持每個網絡請求會話,通過緩存一個給定用戶的對象的持續時間,通過一些鉤住編程魔術來處理他們的請求。
如果您決定將相同的會話度量應用於桌面應用程序,那麼您將需要引入一個圖層,該圖層會在任何用戶頁面交互中觸發會話啓動,並結束反饋給它們的結果的會話。
不幸的是,我沒有全面的解決方案給你,但希望能讓你走上正確的道路。
在桌面應用程序中使用IoC容器時,您沒有在Web應用程序中使用的Scope。每個WebRequest或每個會話的作用域不可用。
所以你必須使用另一種類型的範圍,如pero線程範圍。或者,如果您有特殊要求,您可以創建自定義範圍,以便決定何時啓動以及何時完成。 https://github.com/ninject/ninject/wiki/Object-Scopes
是否只有一個用戶一次使用應用程序實例?如果是這樣你*可以*使用自定義作用域('.InScope(...)')。但是,如果你只有一些管理當前會話狀態('.Start()','.Stop()','.CurrentSessionId' ...)的單身'SessionManager',也許會更好。這樣你就不需要重新創建對象圖的一部分,而只需要管理狀態。需要知道當前會話的任何組件只是詢問「ISessionManager」。 – BatteryBackupUnit 2014-09-03 05:30:08
這似乎是一個不錯的解決方案。我可以讓SessionManager注入必要的工廠,爲任何感興趣的人生成會話相關數據服務。 – Wouter 2014-09-04 08:13:36
我仍然對如何處理桌面應用程序中的IoC範圍感興趣。 Web開發人員似乎對每個請求範圍都很容易。 – Wouter 2014-09-04 08:14:26