C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④
01
—
自定義引導程序
在上一部分中,我們討論了Caliburn.Micro WPF應用程序的最基本配置,并演示了與操作和約定相關的兩個簡單功能。在這一部分中,我想進一步探討Bootstrapper類。讓我們首先將應用程序配置為使用IoC容器。本例中我們將使用內置容器,但是Caliburn.Micro可以很好地處理任何容器。首先,繼續學習第1部分的代碼。我們將以此為出發點。現在,讓我們創建一個名為SimpleBotstrapper的新引導程序。使用以下代碼:
using System; using System.Collections.Generic; using System.Reflection; using System.Windows;public class SimpleBootstrapper : BootstrapperBase {private SimpleContainer container;public SimpleBootstrapper(){Initialize();}protected override void Configure(){container = new SimpleContainer();container.Singleton<IWindowManager, WindowManager>();container.Singleton<IEventAggregator, EventAggregator>();container.PerRequest<ShellViewModel>();}protected override object GetInstance(Type service, string key){return container.GetInstance(service, key);}protected override IEnumerable<object> GetAllInstances(Type service){return container.GetAllInstances(service);}protected override void BuildUp(object instance){container.BuildUp(instance);}protected override void OnStartup(object sender, StartupEventArgs e){DisplayRootViewFor<ShellViewModel>();}protected override IEnumerable<Assembly> SelectAssemblies(){return new[] { Assembly.GetExecutingAssembly() };} }這就是使用內置容器的所有代碼。首先,我們重寫引導程序類的Configure方法。這使我們有機會設置IoC容器,并執行我們可能希望執行的任何其他框架配置,例如定制約定。這里我們創建SimpleContainer并添加WindowManager和EventAggregator,當然還有ShellViewModel,但不是ShellView,因為我們有Assembly.Source.Instance。那么,什么是AssemblySoure.Instance?這是Caliburn.Micro查找視圖的地方。您可以在應用程序期間的任何時候將程序集添加到此中,以使它們可用于框架,但在引導程序中也有一個特殊的位置來執行此操作。只需像這樣覆蓋SelectAssembly:
protected override IEnumerable<Assembly> SelectAssemblies() {return new[] {Assembly.GetExecutingAssembly()}; }您所要做的就是返回一個可搜索程序集的列表。默認情況下,基類返回應用程序所在的程序集。因此,如果您的所有視圖都與應用程序位于同一個程序集中,您甚至不必擔心這一點。如果有多個包含視圖的引用部件,則需要記住這是一個擴展點。此外,如果您正在動態加載模塊,則需要確保在加載模塊時,它們已在IoC容器和AssemblySource.Instance中注冊。
創建容器并為其提供目錄后,我確保添加一些特定于Caliburn.Micro的服務。該框架提供了IWindowManager和IEventAggregator的默認實現。這些是我可能依賴于其他地方的部分,所以我希望它們可以用于注入。我還注冊了容器本身(只是個人喜好)。
配置完容器后,我們需要告訴Caliburn.Micro如何使用它。這就是后面三個覆蓋的目的。框架需要“GetInstance”和“getAllInstance”。“構建”可選擇性地用于向框架執行的IResult實例提供屬性依賴關系。
最后,確保更新App.xaml并將HelloBootstrapper更改為SimpleBootstrapper。就這樣!您可以啟動并運行MEF,還可以處理引導程序的其他一些關鍵擴展點。
當然,只要提供“GetInstance”和“GetAllInstances”的實現,就可以使用所需的任何IoC容器。
02
—
給智者的話
雖然Caliburn.Micro確實通過引導程序的覆蓋和IoC類提供ServiceLocator功能,但您應該避免在應用程序代碼中直接使用它。ServiceLocator被許多人認為是一種反模式。從容器中提取往往會模糊依賴代碼的意圖,并可能使測試更加復雜。
除了上面顯示的內容之外,在引導程序上還有一些其他值得注意的方法。您可以分別在應用程序啟動或關閉時重寫OnStartup和OnExit以執行代碼,也可以在應用程序代碼未專門處理的任何異常之后重寫OnUnandledException以清除。
03
—
v4.0更改
在4.0中,引導程序看到了一些變化,即DisplayRootViewFor方法返回任務,可以等待它們。
protected Task DisplayRootViewFor<TViewModel>(IDictionary<string, object> settings = null) {return DisplayRootViewForAsync(typeof(TViewModel), settings); }在Office和WinForms應用程序中使用Caliburn.Micro
可以從非Xaml主機使用Caliburn.Micro。為了實現這一點,您必須遵循稍微不同的過程,因為您的應用程序不是通過App.xaml啟動的。相反,通過繼承BoostrapperBase(非通用版本)來創建自定義boostrapper。繼承時,應將“false”傳遞給基構造函數的“useApplication”參數。這允許引導程序在不存在Xaml應用程序實例的情況下正確配置Caliburn.Micro。啟動框架所需要做的就是創建引導程序的實例并調用Initialize()方法。一旦類被實例化,您就可以像普通一樣使用Caliburn.Micro,可能通過調用IWindowManager來顯示新的UI。
04
—
最后
原文標題:Caliburn.Micro Xaml made easy
原文鏈接:https://caliburnmicro.com/documentation/bootstrapper
翻譯:dotnet編程大全
C#技術群?:?添加小編微信mm1552923,備注:進群!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dotnet 将自动代码格式化机器人带入
- 下一篇: C#内建接口:IComparable