当前位置:首页 > Web开发 > 正文

配置时最好将被依赖的模块放前面 办法2、不添加直接引用关系

2024-03-31 Web开发

我们但愿将一个项目(dll)看做一个模块/插件,一个模块往往需要在应用启动时做一些初始化事情,好比向IOC容器添加一些处事,为应用配置东西添加本身的数据源;也但愿在应用封锁时做一些收尾事情,asp.net core为我们供给了这种机制,先来看看如何使用,再讲讲道理。

如何使用?

1、创建asp.net core 3.1的web应用措施,WebApplication6

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

技术图片

3、在插件项目ClassLibrary2中界说实现IHostingStartup的类

1 public class HostingStartup : IHostingStartup 2 { 3 public void Configure(IWebHostBuilder builder) 4 { 5 //向IOC容器添加或替换各类处事 6 builder.ConfigureServices((c,b)=> { 7 b.AddSingleton<Class1>(); 8 }); 9 //为应用配置东西添加更大都据源 10 builder.ConfigureAppConfiguration(c => { 11 c.AddInMemoryCollection(new Dictionary<string, string> { {"a","tttt" } }); 12 });
//措置惩罚惩罚当前模块的其它初始化操纵
13 } 14 }

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

技术图片

6、在主措施WebApplication6中设置环境变量,

技术图片

除了这样配置,,我们也可以在主措施的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,然后再挪用它一次

每次写点对象都语无伦次,哈哈

asp.net core 3.x 模块化开发之HostingStartup

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31703.html