dotnetcore主機學(xué)習
學(xué)習了解下netcore的"主機"
"主機"是一個程序環(huán)境,可以在其上運行一些功能.
例如,一臺計算機,在上面運行一個游戲軟件.可以叫計算機為"主機".
那為什么要做這樣一個"主機"呢?
游戲軟件的運行需要一些軟硬件資源還要設(shè)置和讀取環(huán)境配置,"主機"就能打包這些軟硬件資源,并且提供這些資源的信息.
這個就是計算機主機的概念,體現(xiàn)在軟件開發(fā)模式上.
練習示例
環(huán)境: vs2019 / net5
做一個定時顯示時間的程序,放在這個"主機"里運行.
1. 新建一個netcore的控制臺應(yīng)用程序,添加 Microsoft.Extensions.Hosting 的nuget包.
2.報時程序類(干活的程序)
? ? public class AlertTime
? ? {
? ? ? ? public readonly System.Timers.Timer time = new();
? ? ? ? public AlertTime()
? ? ? ? {
? ? ? ? ? ? time.Elapsed += Time_Elapsed;
? ? ? ? ? ? time.Interval = 1000;
? ? ? ? }
? ? ? ? private void Time_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
? ? ? ? {
? ? ? ? ? ? // 在控制臺打印時間
? ? ? ? ? ? Console.WriteLine(DateTime.Now.ToString());
? ? ? ? }
? ? }
3.報時程序控制類
? ? public class AlertTimeCtrl : IHostedService
? ? {
? ? ? ? private AlertTime _work = new();
? ? ? ? public Task StartAsync(CancellationToken cancellationToken)
? ? ? ? {
? ? ? ? ? ? _work.time.Start();
? ? ? ? ? ? return Task.CompletedTask;
? ? ? ? }
? ? ? ? public Task StopAsync(CancellationToken cancellationToken)
? ? ? ? {
? ? ? ? ? ? _work.time.Stop();
? ? ? ? ? ? return Task.CompletedTask;
? ? ? ? }
? ? }
4.建立主機
? ? ? ? public static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? // host ConfigServices 主機服務(wù)配置
? ? ? ? ? ? static void servicesCfg(HostBuilderContext hostContent, IServiceCollection services)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? // 添加服務(wù)
? ? ? ? ? ? ? ? services.AddHostedService<AlertTimeCtrl>();
? ? ? ? ? ? }
? ? ? ? ? ? // 實例化主機(使用默認的主機),添加服務(wù)
? ? ? ? ? ? IHostBuilder hostbuild = Host.CreateDefaultBuilder();
? ? ? ? ? ? hostbuild.ConfigureServices(servicesCfg);
? ? ? ? ? ? // 生成并開啟主機
? ? ? ? ? ? IHost host = hostbuild.Build();
? ? ? ? ? ? host.Run();
? ? ? ? }
程序理解
AlertTime就是工作程序,和"主機"的關(guān)系.就如同游戲軟件和運行這游戲的計算機.
AlertTimeCtrl類是為了實現(xiàn) IHostedService 接口,這個接口的功能就是兩個方法,開始(StartAsync)和停止(StopAsync).
對于要在"主機"里運行的程序,規(guī)定要有這兩個方法.也就是要實現(xiàn) IHostedService 接口,這個類具體實現(xiàn)就是,在開始方法里打開定時器,結(jié)束方法里關(guān)閉定時器.
有了程序,也設(shè)好了在"主機"里運行的條件,最后來建立主機:
?
用這個方法建立"主機",沒有配置
IHostBuilder hostbuild = new HostBuilder();
可以用默認模板建立,比較省事,Host這個靜態(tài)類,提供這個"主機"模板
IHostBuilder hostbuild = Host.CreateDefaultBuilder();
?
把工作程序加入到"主機"里
hostbuild.ConfigureServices(servicesCfg);
servicesCfg參數(shù)是一個方法,方法定義是 void(HostBuilderContext hostContent, IServiceCollection services)
hostContent參數(shù)是"主機"上下文對象,services是"主機"里所有的服務(wù)程序集合.
調(diào)用services的add方法,把報時程序加到"主機"里
services.AddHostedService<AlertTimeCtrl>();
?
Build: 初始化"主機"配置,生成"主機"對象
IHost host = hostbuild.Build();
Run: 運行"主機"
host.Run();
感受
這個練習主要是學(xué)習編程模式了,程序代碼只有很少幾行,是編程模式的表示形式.如果不理解框架程序的設(shè)計思路,基本上用不好,用不習慣.
"主機"承載服務(wù),程序配置用的是依賴注入模式,如果不熟悉這個,會感覺程序配置比較費解,需要寫個方法做配置參數(shù),通過這個方法的參數(shù)進行配置.
參考文檔比較詳細的講解了依賴注入還有IOC這些.
經(jīng)常感覺用框架程序麻煩,不好用,不如直接用庫.主要是沒了解它的設(shè)計思路,感覺使用復(fù)雜,沒用的東西多.但學(xué)習程序框架的設(shè)計思路很有用,
一來可以比較容易的使用這個程序框架,再就是可以使用這思路定制符合自己要求的程序框架.
參考文檔:https://www.dianjilingqu.com/459467.html