我们希望将一个项目(dll)看做一个模块/插件,一个模块往往需要在应用启动时做一些初始化工作,比如向IOC容器添加一些服务,为应用配置对象添加自己的数据源;也希望在应用关闭时做一些收尾工作,asp.net core为我们提供了这种机制,先来看看如何使用,再讲讲原理。

如何使用?

1、创建asp.net core 3.1的web应用程序,WebApplication6

2、创建我们的模块/插件项目,一个Standard2.1项目叫ClassLibrary2

3、在插件项目ClassLibrary2中定义实现IHostingStartup的类

     public class HostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
//向IOC容器添加或替换各种服务
builder.ConfigureServices((c,b)=> {
b.AddSingleton<Class1>();
});
//为应用配置对象添加更多数据源
builder.ConfigureAppConfiguration(c => {
c.AddInMemoryCollection(new Dictionary<string, string> { {"a","tttt" } });
});
//处理当前模块的其它初始化操作
}
}

5、在插件项目ClassLibrary2中随便找个类文件中,设置[assembly: HostingStartupAttribute(typeof(ClassLibrary2.HostingStartup))]

6、在主程序WebApplication6中设置环境变量,

除了这样配置,我们也可以在主程序的Program.main配置主机时手动覆盖配置值,以达到设置插件关联的程序集的目的,多个插件程序集用分号“;”分割

 public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>{
webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "ClassLibrary2");
webBuilder.UseStartup<Startup>();
});

还可以使用webBuilder.UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey, "ClassLibrary3");排出一些程序集,不把这些程序集当做插件来加载

原理是啥?

程序启动时会根据环境变量找到对应的插件程序集
根据程序集找到关联的 HostingStartupAttribute
通过 HostingStartupAttribute拿到插件启动类并调用其Confiure方法
方法内部可以做此插件的初始化工作、向主机IOC容器注册各种服务、设置应用配置的数据源等

多个模块的启动顺序是啥?

按配置的顺序加载模块的,所以最少依赖的模块应该写在前面,这个设计不如abp

模块之间如何通讯?

办法1、直接引用,配置时最好将被依赖的模块放前面

办法2、不添加直接引用关系,而用中间层实现
如添加一个中间项目,定义各种接口,由模块B来实现,在模块B中向容器注册自己的服务。模块A引用中间类库,直接在使用地方注入接口就ok啦

应用关闭时模块如果做一些收尾工作?

可以定义一个应用生命周期事件处理程序(实现IHostedApplicationLifetime),在不同事件中定义此模块的收尾工作。然后在模块启动类中向IOC注册这个服务。但这样有个问题,默认的生命周期事件处理程序被我们替换掉了,所以我们的类应该用构造函数注入IHostedApplicationLifetime,然后再调用它一次

每次写点东西都语无伦次,哈哈

asp.net core 3.x 模块化开发之HostingStartup的更多相关文章

  1. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  2. Asp.net Mvc模块化开发之“部分版本部分模块更新(上线)”

    项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统不是本文探讨的问题,但是重构后如何上线部署和本文关系密切.这个大家可 ...

  3. [JS] JS模块化开发之RequireJS

    本节将简述RequireJS常用的功能 RequireJS 实现了 Asynchronous Module API. 目录: 为什么使用RequireJS 加载RequireJS Hello Worl ...

  4. 前端模块化开发之seaJs

    了解后端语言的童鞋一定听过模块化开发的概念,比如java.python等后端语言都有自己的模块化特性,然而和后端语言相比,javascript还尚未实现模块化的功能,虽然之后的更高版本可能引入模块化开 ...

  5. 模块化开发之butterknife 在 library中使用

    在Android开发中butterknife是一个很好的对资源初始化的工具,它可以使你的代码简洁通俗易懂,同时配合Android ButterKnife Zelezny插件可以让你写代码的速度提升至少 ...

  6. 模块化开发之sea.js

    随着时间的推移,原生js越来越强大,es6中的improt,export已经可以实现模块化开发,但可惜的是现在的浏览器还不支持,需要进行编译,相信在不久的将来,一定会大行其道,今天我们来聊聊模块化开发 ...

  7. 模块化开发之Amd规范和Cmd规范

    CMD规范:是SeaJS 在推广过程中对模块定义的规范化产出的. AMD规范:是 RequireJS 在推广过程中对模块定义的规范化产出的 // CMD define(function(require ...

  8. 模块化开发之sea.js实现原理总结

    seajs官网说:seajs是一个模块加载器,所以学习它并不难. 在我的理解就是:本来我们是需要手动创建 script标签 引入 js文件的,但用seajs后,它就自动帮我们完成这些工作. 这里只说实 ...

  9. 项目伪模块化开发之:requirejs(AMD)开发

    附:伪模块开发,终将会被es6的模块开发取代.其只为过渡阶段使用 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码 ...

随机推荐

  1. Activiti 工作流入门指南

    概览 如我们的介绍部分所述,Activiti目前分为两大类: Activiti Core Activiti Cloud 如果你想上手Activiti的核心是否遵循了新的运行时API的入门指南:Acti ...

  2. iOS设备 微信h5页面回退 内容不刷新的问题

    原因分析: 一.android 浏览器 包括微信的开发者工具 都是ok的返回可以刷新页面但是唯有iOS不行. 二.iOS 浏览器原因:history.go(-1)返回上一页后,页面内容并不会刷新.在B ...

  3. Centos 6.5 配置hadoop2.7.1

    1 Centos 6.5 编译hadoop2.7.1 主机配置: sudo yum install gcc gcc-c++ sudo yum install ncurses-devel sudo yu ...

  4. Editplus配置java编译运行环境

    1.进入配置环境界面 首先,从菜单"工具(Tools)"->"配置用户工具..."进入用户工具设置. 在类别里展开"工具"树形菜单-& ...

  5. 在spring security3中使用自定义的MD5和salt进行加密

    首先看代码: <authentication-manager alias="authenticationManager"> <authentication-pro ...

  6. P1024 硬币问题

    题目描述 假设现在有面值为1, 5, 10, 50, 100, 500的硬币各无限枚, 如果用这些硬币来支付A元, 最少需要多少枚硬币? 输入格式 一个整数A(0<=A<=1e9), 表示 ...

  7. JMETER+JENKINS接口测试持续集成

    FIDDER+ANT+JENKINS+JMETER+SVN+tomcat接口测试集成 操作流程: 1.测试人员通过FIDDER过滤抓取接口调用信息,导出成jmx文件.(jmeter支持命令行方式调用j ...

  8. H3C网络监测工具命令

    1.Debugging 2.Display debugging 3.Display diagnostic-information display diagnostic-information 命令用来 ...

  9. 在eclipse动态网页项目中,编写web.xml时,servlet标签报错.

    cvc-complex-type.2.4.b: The content of element 'servlet' is not complete. One of '{"http:// jav ...

  10. Shave Beaver! CodeForces - 331B2 (线段树)

    题面 The Smart Beaver has recently designed and built an innovative nanotechnologic all-purpose beaver ...