前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④

C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④

作者头像
用户9127601
发布2022-01-13 08:29:54
8590
发布2022-01-13 08:29:54
举报

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编程大全

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 dotNET编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01
    • 自定义引导程序
    • 02
      • 给智者的话
      • 03
        • v4.0更改
        • 04
          • 最后
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档