.netcore 最简单的承载系统,代码如下。
1 public class Test : IHostedService 2 { 3 public Task StartAsync(CancellationToken cancellationToken) 4 { 5 Console.WriteLine("StartAsync:"+ Thread.CurrentThread.ManagedThreadId); 6 return Task.CompletedTask; 7 } 8 9 public Task StopAsync(CancellationToken cancellationToken) 10 { 11 Console.WriteLine("End"); 12 return Task.CompletedTask; 13 } 14 } 15 16 public class Program 17 { 18 public static void Main(string[] args) 19 { 20 // CreateHostBuilder(args).Build().Run(); 21 Console.WriteLine("qqqqqq:" + Thread.CurrentThread.ManagedThreadId); 22 var builder =new HostBuilder(); 23 builder.ConfigureServices(services => 24 { 25 services.AddHostedService<Test>(); 26 }); 27 28 var host=builder.Build(); 29 host.Run(); 30 Console.WriteLine("qqqqq333q:" + Thread.CurrentThread.ManagedThreadId); 31 }
1. new HostBuilder(), 这里面有
private List<Action<HostBuilderContext, IServiceCollection>> _configureServicesActions = new List<Action<HostBuilderContext, IServiceCollection>>();
执行 builder.ConfigureServices() 这个方法里的委托放进这个集合来。还有几个类似的集合,类似的作用。
在28 行build 的时候,会把这个委托的集合执行一遍。
2.这里面还有 private IServiceProvider? _appServices;
这也是Build 的时候, new ServiceCollection(); 然后把 这个 集合 转为 serviceProvider
从这里依赖注入开始,并 注入了 IHost
Build 的最后把这个 Ihost 返回。
最后Host run .
会把 容器里的 IHostedService 都取出来,并执行Start
然后 等待。直到 Lifttime 通知程序退出。
最后,容器里的 IHostedService 都取出来,并执行Stop
3. 这里有 UseServiceProviderFactory(),这个方法,可以替换DI容器,比如autofac.
4. 上面的代码 改为 网站:
var webHostBuilderOptions = new WebHostBuilderOptions();
WebHost.ConfigureWebDefaults(webHostBuilder);
var webhostBuilder = new GenericWebHostBuilder(builder, webHostBuilderOptions);
webhostBuilder.UseStartup<StartUp>();
builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
第二行的方法,里面注入了 kestrel(Iserver).
最后一行的 GenericWebHostService 引用了 Iserver