Asp.NET Core3.0模块化开发之HostingStartup

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

如何使用?

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

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

Asp.NET Core3.0模块化开发之HostingStartup

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

Asp.NET Core3.0模块化开发之HostingStartup

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

Asp.NET Core3.0模块化开发之HostingStartup

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

Asp.NET Core3.0模块化开发之HostingStartup

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

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

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

原理是啥?

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

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

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

模块之间如何通讯?

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

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

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

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

原文出处:微信公众号【 DotNET技术圈】,作者【变形精怪】

原文链接:https://mp.weixin.qq.com/s?__biz=MzU2OTY3MTYzOA==&mid=2247485341&idx=2&sn=95b2a6752aba9173955cd096a98550ef&chksm=fcfa6d24cb8de4323d6dc088407c2dbe0172481e34b734b4e36276f3d87f5e46f7482a86999c&mpshare=1&scene=1&srcid=&sharer_sharetime=1578964268867&sharer_shareid=cc609ea2d56165426b8c4ccd3a28d316&key=da1c5a877f2f09a701434fb6acec1ac2848aa675d79dda55e0ca7c98cc5ca42ae453ee0a2e662921949a0f783e846ab27f426096dc51898a8b529a97d8b136eeb0f6b7a59a1fd9ed6a73a96b8b946a1b&ascene=1&uin=Mjk4MzIyNjQxOQ%3D%3D&devicetype=Windows+10&version=62070158&lang=zh_CN&exportkey=AxuiIyhOifJs3OOFrl4jcUI%3D&pass_ticket=aLfCeLYx1WPbtAzMPZ%2FB5zxJ5W%2BIgN08o2%2FZTtNz3xy9LchDif5J2ybXlgVLDPhC

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论