2. 自定义Bootstrapper-翻译

在上一部分,我们讨论了最基本的配置为一个Caliburn.Micro wpf应用程序,并演示了几个与操作和约定相关的简单特性。在这一部分中,我想更多地探索Bootstrapper类。让我们从配置应用程序以使用IoC容器开始。我们将在这个例子中使用内置容器,Caliburn.Micro也可以很好地与任何容器配合使用。

首先,使用上一章的代码。我们用它作为我们的起点。现在,让我们创建一个名为SimpleBootstrapper的新Bootstrapper。使用以下语句:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Reflection;
 4 using System.Windows;
 5 
 6 public class SimpleBootstrapper : BootstrapperBase
 7 {
 8     private SimpleContainer container;
 9 
10     public SimpleBootstrapper()
11     {
12         Initialize();
13     }
14 
15     protected override void Configure()
16     {
17         container = new SimpleContainer();
18 
19         container.Singleton<IWindowManager, WindowManager>();
20         container.Singleton<IEventAggregator, EventAggregator>();
21 
22         container.PerRequest<ShellViewModel>();
23     }
24 
25     protected override object GetInstance(Type service, string key)
26     {
27         return container.GetInstance(service, key);
28     }
29 
30     protected override IEnumerable<object> GetAllInstances(Type service)
31     {
32         return container.GetAllInstances(service);
33     }
34 
35     protected override void BuildUp(object instance)
36     {
37         container.BuildUp(instance);
38     }
39 
40     protected override void OnStartup(object sender, StartupEventArgs e)
41     {
42         DisplayRootViewFor<ShellViewModel>();
43     }
44 
45     protected override IEnumerable<Assembly> SelectAssemblies()
46     {
47         return new[] { Assembly.GetExecutingAssembly() };
48     }
49 }

这就是使用内建容器的所有代码。首先,我们重写Bootstrapper类的Configure方法。这使我们有机会设置我们的IoC容器以及执行我们可能想要做的任何其他框架配置,例如自定义约定。这里我们创建了SimpleContainer,并添加了WindowManager和EventAggregator,当然还有ShellViewModel,但不是ShellView,因为我们有Assembly.Source.Instance。那么,什么是 Assembly.Source.Instance ? 这就是Caliburn.Micro查找Views。你可以在应用程序的任何时候添加程序集,以使它们对框架可用,但在Bootstrapper中也有一个特殊的地方可以这样做。只需像这样重写SelectAssemblies:

1 protected override IEnumerable<Assembly> SelectAssemblies()
2 {
3     return new[] {
4         Assembly.GetExecutingAssembly()
5     };
6 }

 您所要做的就是返回一个可搜索程序集的列表。默认情况下,基类返回应用程序所在的程序集。因此,如果您的所有视图都与应用程序在同一个程序集中,您甚至不需要担心这个问题。如果您有多个包含视图的引用程序集,则需要记住这个扩展点。此外,如果动态加载模块,则需要确保它们在加载时已经注册到IoC容器和AssemblySource.Instance。

在创建容器并为其提供目录之后,我要确保添加一些 Caliburn.Micro-specific 服务。框架提供了IWindowManager和IEventAggregator的默认实现。这些是我可能在其他地方依赖的部分,所以我希望它们可以被注入。我还注册了容器本身(只是个人偏好)。

在配置容器之后,我们需要告诉Caliburn.Micro怎么使用。这就是接下来三个 override 的目的。" GetInstance "和" GetAllInstances "是框架需要的。“BuildUp”可选地用于向框架执行的IResult实例提供属性依赖。

最后,确保更新App.xaml并将HelloBootstrapper更改为SimpleBootstrapper。就是这样!你已经启动并运行了MEF,并且你也掌握了Bootstrapper的其他一些关键扩展点。

当然,你可以使用任何你想要的IoC容器,只要你为“GetInstance”和“GetAllInstances”提供实现。

忠告

虽然 Caliburn.Micro 确实通过Bootstrapper的重写和IoC类提供了ServiceLocator功能,但你应该避免在应用程序代码中直接使用它。很多人认为ServiceLocator是一种anti-pattern(反面模式)。从容器中提取往往会模糊相关代码的意图,并可能使测试变得更加复杂。

除了上面显示的,Bootstrapper上还有一些其他值得注意的方法。你可以覆盖OnStartup和OnExit来分别在应用程序启动或关闭时执行代码,以及OnUnhandledException来清除应用程序代码没有特别处理的任何异常。

v4.0变化

在4.0中,Bootstrapper已经看到了一些变化,那就是DisplayRootViewFor方法返回一个任务,他们可以等待。

在Office和Winforms应用中使用 Caliburn.Micro

 Caliburn.Micro 可以在非xaml主机上使用。为了实现这一点,您必须遵循一个略有不同的过程,因为您的应用程序不是通过App.xaml初始化的。相反,可以通过继承BoostrapperBase(非泛型版本)来创建自定义引导程序。当你继承时,你应该将“false”传递给基构造函数的“useApplication”参数。这允许引导程序在不存在Xaml应用程序实例的情况下正确配置 Caliburn.Micro 。启动框架所需要做的就是创建Bootstrapper的一个实例并调用Initialize()方法。一旦类被实例化,您就可以像平常一样使用 Caliburn.Micro ,可能是通过调用IWindowManager来显示新的UI。

posted @ 2023-10-12 10:17  鱼洄  阅读(86)  评论(0)    收藏  举报