.NET Core -核心组件


Hosting(服务托管主机)和管道(中间件)

托管服务注册实例

 public class Sample01
    {
        public class SystemClock : IHostedService
        {
            private Timer _timer;

            //启动服务
            public Task StartAsync(CancellationToken cancellationToken)
            {
                _timer = new Timer(state =>
                {
                    Console.WriteLine($"Current Time:{DateTime.Now.ToLongTimeString()}");
                }, null, 0, 1000);

                return Task.CompletedTask;
            }
            //服务停止
            public Task StopAsync(CancellationToken cancellationToken)
            {
                _timer?.Dispose();
                return Task.CompletedTask;
            }
        }

        public static void Start()
        {
            var host = new HostBuilder()//主机构建起
                .ConfigureServices(collection => collection
                    .AddSingleton())//依赖注入
                    .Build();
            host.Run();//运行主机
        }
    }

托管服务注册示例 使用服务的方式注册(依赖注入)

public class Sample02
    {
        /// 
        /// 温度
        /// 
        public interface ITemperatureCollector
        {
            int Get();
        }

        /// 
        /// 湿度
        /// 
        public interface IHumidityCollector
        {
            int Get();
        }

        /// 
        /// 空气质量
        /// 
        public interface IAirQualityCollector
        {
            int Get();
        }

        public class Collector: ITemperatureCollector, IHumidityCollector, IAirQualityCollector
        {
            int ITemperatureCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }

            int IHumidityCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }

            int IAirQualityCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }
        }

        public class AirEnvironmentService : IHostedService
        {
            private readonly ITemperatureCollector _temperatureCollector;
            private readonly IHumidityCollector _humidityCollector;
            private readonly IAirQualityCollector _airQualityCollector;

            private Timer _timer;

            public AirEnvironmentService(
                ITemperatureCollector temperatureCollector,
                IHumidityCollector humidityCollector,
                IAirQualityCollector airQualityCollector
            )
            {
                _temperatureCollector = temperatureCollector;
                _humidityCollector = humidityCollector;
                _airQualityCollector = airQualityCollector;
            }

            public Task StartAsync(CancellationToken cancellationToken)
            {
                _timer = new Timer(state =>
                {
                    Console.WriteLine($"温度:{_temperatureCollector.Get(), -10}" +
                                      $"湿度:{_humidityCollector.Get(), -10}" +
                                      $"空气质量:{_airQualityCollector.Get(), -10}" +
                                      $"时间:{DateTime.Now.ToLongTimeString()}");
                }, null,0, 1000);

                return Task.CompletedTask;
            }

            public Task StopAsync(CancellationToken cancellationToken)
            {
                _timer?.Dispose();
                return Task.CompletedTask;
            }
        }

        public static void Start()
        {
            var collector = new Collector();
            var host = new HostBuilder()
                .ConfigureServices(collection => collection
                    .AddSingleton(collector)
                    .AddSingleton(collector)
                    .AddSingleton(collector)
                    .AddHostedService()//环境服务
                ).Build();

            host.Run();
        }
    }

托管服务注册示例 使用服务的方式注册同时使用选项服务获取配置文件设置服务内的时间

 

 public class Sample03
    {
        /// 
        /// 温度
        /// 
        public interface ITemperatureCollector
        {
            int Get();
        }

        /// 
        /// 湿度
        /// 
        public interface IHumidityCollector
        {
            int Get();
        }

        /// 
        /// 空气质量
        /// 
        public interface IAirQualityCollector
        {
            int Get();
        }

        public class Collector: ITemperatureCollector, IHumidityCollector, IAirQualityCollector
        {
            int ITemperatureCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }

            int IHumidityCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }

            int IAirQualityCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }
        }

        //选项类
        public class AirEnvironmentOptions
        {
            public long Interval { get; set; }
        }

        public class AirEnvironmentService : IHostedService
        {
            private readonly ITemperatureCollector _temperatureCollector;
            private readonly IHumidityCollector _humidityCollector;
            private readonly IAirQualityCollector _airQualityCollector;
            private readonly AirEnvironmentOptions _options;

            private Timer _timer;

            public AirEnvironmentService(
                ITemperatureCollector temperatureCollector,
                IHumidityCollector humidityCollector,
                IAirQualityCollector airQualityCollector,
                IOptions options
            )
            {
                _temperatureCollector = temperatureCollector;
                _humidityCollector = humidityCollector;
                _airQualityCollector = airQualityCollector;
                _options = options.Value;
            }

            public Task StartAsync(CancellationToken cancellationToken)
            {
                _timer = new Timer(state =>
                {
                    Console.WriteLine($"温度:{_temperatureCollector.Get(), -10}" +
                                      $"湿度:{_humidityCollector.Get(), -10}" +
                                      $"空气质量:{_airQualityCollector.Get(), -10}" +
                                      $"时间:{DateTime.Now.ToLongTimeString()}");
                }, null,0, _options.Interval);

                return Task.CompletedTask;
            }

            public Task StopAsync(CancellationToken cancellationToken)
            {
                _timer?.Dispose();
                return Task.CompletedTask;
            }
        }

        public static void Start(string[] args)
        {
            var collector = new Collector();
            var host = new HostBuilder()   
                //通过命令行指定的方式获取对应的配置文件
                .ConfigureHostConfiguration(builder => builder.AddCommandLine(args))
                //用于配置托管服务的配置对象利用委托注册配置文件
                .ConfigureAppConfiguration((context, builder) => builder
                    .AddJsonFile("appsettings.json", false)
                    //添加环境名称
                    .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json",true)
                )
                //这里有两个参数的context这个是主机上下文对象 
                .ConfigureServices((context, collection) => collection
                    .AddSingleton(collector)
                    .AddSingleton(collector)
                    .AddSingleton(collector)
                    .AddHostedService()
                    .AddOptions()
                    .Configure(
                        context.Configuration.GetSection("AirEnvironment"))//获取配置文件中的配置
                ).Build();

            host.Run();
        }
    }

 加入日志:

 public class Sample04
    {
        /// 
        /// 温度
        /// 
        public interface ITemperatureCollector
        {
            int Get();
        }

        /// 
        /// 湿度
        /// 
        public interface IHumidityCollector
        {
            int Get();
        }

        /// 
        /// 空气质量
        /// 
        public interface IAirQualityCollector
        {
            int Get();
        }


        public class Collector: ITemperatureCollector, IHumidityCollector, IAirQualityCollector
        {
            int ITemperatureCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }

            int IHumidityCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }

            int IAirQualityCollector.Get()
            {
                var random = new Random();
                return random.Next(0, 100);
            }
        }

        public class AirEnvironmentOptions
        {
            public long Interval { get; set; }
        }
        /// 
        /// 控制质量发布器
        /// 
        public class AirEnvironmentPublisher
        {
            private const string Template = "温度:{temperature, -10}" +
                                             "湿度:{humidity, -10}" +
                                             "空气质量:{airQuality, -10}" +
                                             "时间:{now}";
            private readonly Actionint,int,int,string, Exception> _logAction;
            private readonly ILogger _logger;
            /// 
            /// 控制质量发布器
            /// 
            /// 
            public AirEnvironmentPublisher(ILogger logger)
            {
                _logger = logger;
                _logAction = LoggerMessage.Define<int, int, int, string>(LogLevel.Information, 0, Template);
            }

            public void Publish(int temp, int humi, int airq)
            {
                _logAction(_logger, temp, humi, airq, DateTime.Now.ToLongTimeString(), null);
            }
        }

        public class AirEnvironmentService : IHostedService
        {
            private readonly ITemperatureCollector _temperatureCollector;
            private readonly IHumidityCollector _humidityCollector;
            private readonly IAirQualityCollector _airQualityCollector;
            private readonly AirEnvironmentPublisher _publisher;
            private readonly AirEnvironmentOptions _options;

            private Timer _timer;

            public AirEnvironmentService(
                ITemperatureCollector temperatureCollector,
                IHumidityCollector humidityCollector,
                IAirQualityCollector airQualityCollector,
                AirEnvironmentPublisher publisher,
                IOptions options
            )
            {
                _temperatureCollector = temperatureCollector;
                _humidityCollector = humidityCollector;
                _airQualityCollector = airQualityCollector;
                _publisher = publisher;
                _options = options.Value;
            }

            public Task StartAsync(CancellationToken cancellationToken)
            {
                _timer = new Timer(state =>
                {
                    _publisher.Publish(
                        _temperatureCollector.Get(),
                        _humidityCollector.Get(), 
                        _airQualityCollector.Get());
                }, null,0, _options.Interval);

                return Task.CompletedTask;
            }

            public Task StopAsync(CancellationToken cancellationToken)
            {
                _timer?.Dispose();
                return Task.CompletedTask;
            }
        }

        public static void Start()
        {
            var collector = new Collector();
            var host = new HostBuilder()
                .ConfigureAppConfiguration((context,builder) => builder.AddJsonFile("appsettings.json"))
                .ConfigureServices((context, collection) => collection
                    .AddSingleton(collector)
                    .AddSingleton(collector)
                    .AddSingleton(collector)
                    .AddSingleton()
                    .AddHostedService()
                    .AddOptions()
                    .Configure(
                        context.Configuration.GetSection("AirEnvironment"))
                )
                .ConfigureLogging((context, builder) => builder
                    .AddConfiguration(context.Configuration.GetSection("Logging"))
                    .AddConsole())
                .Build();

            host.Run();
        }
    }

web开发平台 请求处理管道  

路由,会话,缓存,认证

长时间运行的后台服务,是一个托管服务,