C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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自定义引导程序④的主要内容,如果未能解决你的问题,请参考以下文章
C# WPF MVVM开发框架Caliburn.Micro常用功能指南②
C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①
C# WPF MVVM开发框架Caliburn.Micro 自定义Conventions⑩