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