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,备注:进群!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 使用XmlPullParser解析xml

这里我们假设要解析的xml文件名为&#xff1a;test.xml&#xff0c;我们将其放在assets路径中。 xml文件内容为&#xff1a; <?xml version1.0 encodingutf-8 standaloneyes ?> <books><book id"1"><name>Java编程思想</name><pr…

链表之打印两个有序链表的公共部分

题目:打印两个有序链表的公共部分 package com.chenyu.zuo.linkedList; /*** 打印有序链表的公共部分* @author 陈喻*题目:给定两个有序链表的头指针head1和head2,打印出两个链表的公共部分*思路:因为有序*如果head1的值小于head2,则head1往下移动*如果head2的值小于head1,…

批处理for命令详解

批处理for命令详解批处理for命令详解 2008-03-07 11:00 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令 参数…

趁爸妈不在家约男朋友回家吃饭,然而......

1 有没有男主很脆弱的电影&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 成长期-成熟期-完全体-究极体▼3 千万别在家乱放星巴克的袋子&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 发生了很奇怪的事情▼5 只有你想不到&#xff0c;没…

java泛型不是计算运行时的数据类型

2019独角兽企业重金招聘Python工程师标准>>> package com.ada.data.entity;import java.io.Serializable;import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuper…

spark 连接mysql 命令_spark-submit命令包括mysql连接器

我有一个scala对象文件&#xff0c;它在内部查询mysql表做一个连接并将数据写入s3&#xff0c;在本地测试我的代码它运行得很好 . 但是当我将它提交到集群时&#xff0c;它会抛出以下错误&#xff1a;线程“main”java.sql.SQLException中的异常&#xff1a;在org.apache.spark…

C#内建接口:IComparable

这节开一个新的系列&#xff1a;C#内建接口。主要给大家讲一下C#内部给我们定义的一些常用的接口&#xff0c;以及它们是怎么使用的。基本上一节讲一个吧&#xff0c;本节先从IComparable开始。01了解IComparable一般的&#xff0c;值类型的数据比较大小&#xff0c;就是看它俩…

链表之删除单链表倒数第K个节点

删除单链表倒数第K个节点 题目: 删除单链表中倒数第K个节点, 思路: 给我们一个单链表,我们需要删除倒数第K个节点,比如链表每个节点值是1、2、3、4、5、6 K值是2,链表的总长度是6,要得倒数第二个数的值,前面就有6-2=4个的值,如果头结点往下移,移到…

script的defer和async

我们常用的script标签&#xff0c;有两个和性能、js文件下载执行相关的属性&#xff1a;defer和async defer的含义【摘自https://developer.mozilla.org/En/HTML/Element/Script】 This Boolean attribute is set to indicate to a browser that the script is meant to be exe…

WWDC 2013 Session笔记 - Xcode5和ObjC新特性

这是我的WWDC2013系列笔记中的一篇&#xff0c;完整的笔记列表请参看这篇总览。本文仅作为个人记录使用&#xff0c;也欢迎在许可协议范围内转载或使用&#xff0c;但是还烦请保留原文链接&#xff0c;谢谢您的理解合作。如果您觉得本站对您能有帮助&#xff0c;您可以使用RSS或…

难以摸透的直男脑回路......

1 你年纪不小了&#xff0c;该结婚了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 泰国小哥低成本Cos赛博朋克2077 ▼3 郑爷爷也太会了吧▼4 奇奇怪怪的知识又增加了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 酸奶今天7.1折&#xff08;via.…

数论概论(Joseph H.Silverman) 习题 39.1 $\sqrt{3}$和$\sqrt{5}$的连分数展开中的重复现象...

计算$\sqrt{3}$和$\sqrt{5}$的连分数中的前10项. 解:\begin{align*} \sqrt{3}1\dfrac{1}{\dfrac{1}{\sqrt{3}-1}}\end{align*}\begin{align*} \sqrt{3}1\dfrac{1}{1\dfrac{1}{\dfrac{1}{\dfrac{\sqrt{3}-1}{2}}}}\end{align*}\begin{align*} \sqrt{3}1\dfrac{1}{1\dfrac{1}{2\d…

ansible备份mysql_ansible做mysql备份和安全加固

2019独角兽企业重金招聘Python工程师标准>>>1. mysql备份A patch adding nameall was added to the mysql_db module on May 12, 2015, so the recommended way to dump all databases is:# Dumps all databases to hostname.sql- mysql_db: statedump nameall target…

链表之删除双链表倒数第K个节点

链表之删除双链表倒数第K个节点 题目: 链表之删除双链表倒数第K个节点 思路: 之前写过 http://blog.csdn.net/u011068702/article/details/50280099(链表之删除单链表倒数第K个节点),思路是一样的,如果不知道,你可以参考下 代码实现: package com.chenyu.zuo.link…

如何让代码段只运行在 Debug 模式下 ?

咨询区 Ronnie Overby我的 asp.net core 项目需要访问一个站外的 api 接口&#xff0c;双方协商通过api参数来约定当前请求是 测试 还是 正式, 目前的做法就是在测试环境中放开测试代码&#xff0c;在发布环境再注释掉这段代码&#xff0c;作为极客&#xff0c;我想知道有什么极…

ICMP

ICMP是网络层协议 能反馈和解决网络层的问题 ping traceroute 转载于:https://www.cnblogs.com/YDDMAX/p/5361165.html

(转)svn检出的时候报 Unable to connect to a repository at URL错误

背景&#xff1a;1. SVN服务器&#xff1a;VisualSVN-Server-2.5.5&#xff1b;2. SVN客户端&#xff1a;TortoiseSVN-1.7.6.22632-x64-svn-1.7.4.msi&#xff1b; 在SVN服务器上&#xff0c;新建一个数据仓库aaa&#xff0c;用户ABC拥有读写权限。现象&#xff1a;1.…

今晚包饺子吗?会露馅的那种......

1 让水龙头滴水流动&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 来自干饭人的答题卷▼3 一心只想搞钱&#xff08;via.银教授&#xff09;▼4 奇奇怪怪的东西又增加了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 今晚过来吗&#xff1f;▼6 好…

公司僵尸帐号引发了一系列的入侵事件-细说密码强度验证的重要性

一、前言 每个公司几乎都会有一个公司的内部系统&#xff0c;每个员工的入职的的时候都会给开一个帐号&#xff0c;一般开帐号的这个人不会考虑帐号的安全性&#xff0c;用户名大多都是员工的姓名或者工号&#xff0c;密码也是姓名或者工号或者123456&#xff0c;如果可以输入1…

链表之删除链表中间节点

题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二, 得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除 方法2: 比如链表是1 、2 删除节点1 比如链表是1 、2、3 删除节点2 比如…