.net core 3.1 服务承载【依赖注入】 电脑版发表于:2021/2/2 21:59 ![.netcore](https://img.tnblog.net/arcimg/hb/c857299a86d84ee7b26d181a31e58234.jpg ".netcore") >#.net core 3.1 服务承载【依赖注入】 [TOC] 目录 ------------ tn>https://www.tnblog.net/hb/article/details/5591 ,请结合我上一篇的来看,上一篇连接地址:https://www.tnblog.net/hb/article/details/5568 前言 ------------ tn>大概做的调整如图所示,这样做的好处就是: (1) 通过依赖注入,性能指标的来源可以是不同的地方获得的 (2) 处理的具体方式也可以是不同的实现进行的处理 ![](https://img.tnblog.net/arcimg/hb/eb6b14b63b81493694648524adc078ce.png) 项目内容 ------------ >### 接口的代码 ![](https://img.tnblog.net/arcimg/hb/66edc133922b4a858f0402f44a4167da.png) ```csharp // 网络,内存,CPU性能接口 public interface IMemoryMetricsCollector { long GetUsage(); } public interface INetworkMetricsCollector { long GetThroughput(); } public interface IProcessorMetricsCollector { int GetUsage(); } // 处理接口 public interface IMetricsDeliverer { Task DeliverAsync(PerformanceMetrics performanceMetrics); } ``` >### 实现性能的接口 ```csharp public class FakeMetricsCollector : IProcessorMetricsCollector, INetworkMetricsCollector, IMemoryMetricsCollector { public long GetThroughput() => PerformanceMetrics.Create().Network; public long GetUsage() => PerformanceMetrics.Create().Memory; int IProcessorMetricsCollector.GetUsage() => PerformanceMetrics.Create().Processor; } ``` >### 实现对指标的操作 ```csharp public class FakeMetricsDeliverer : IMetricsDeliverer { public Task DeliverAsync(PerformanceMetrics performanceMetrics) { Console.WriteLine($"[{DateTimeOffset.Now}]:{performanceMetrics}"); return Task.CompletedTask; } } ``` >### 修改PerformanceMetricsCollector ```csharp public sealed class PerformanceMetricsCollector : IHostedService { private readonly IProcessorMetricsCollector _processorMetricsCollector; private readonly INetworkMetricsCollector _networkMetricsCollector; private readonly IMetricsDeliverer _metricsDeliverer; private readonly IMemoryMetricsCollector _memoryMetricsCollector; private IDisposable _scheduler; public PerformanceMetricsCollector( IProcessorMetricsCollector processorMetricsCollector, INetworkMetricsCollector networkMetricsCollector, IMetricsDeliverer metricsDeliverer, IMemoryMetricsCollector memoryMetricsCollector ) { _processorMetricsCollector = processorMetricsCollector; _networkMetricsCollector = networkMetricsCollector; _metricsDeliverer = metricsDeliverer; _memoryMetricsCollector = memoryMetricsCollector; } /// <summary> /// 启动服务 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task StartAsync(CancellationToken cancellationToken) { // 需要调用的方法 需要传入的对象 多久后启动 间隔时长执行一次 _scheduler = new Timer(Callback,null,TimeSpan.FromSeconds(5),TimeSpan.FromSeconds(5)); return Task.CompletedTask; } private async void Callback(object state) { // 通过不同 var performanceMetrics = new PerformanceMetrics() { Memory = _memoryMetricsCollector.GetUsage(), Network = _networkMetricsCollector.GetThroughput(), Processor = _processorMetricsCollector.GetUsage() }; await _metricsDeliverer.DeliverAsync(performanceMetrics); } /// <summary> /// 关闭服务 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task StopAsync(CancellationToken cancellationToken) { _scheduler?.Dispose(); return Task.CompletedTask; } } ``` >### 通过依赖注入的方式 ```csharp var fakeMetricsCollector = new FakeMetricsCollector(); new HostBuilder() .ConfigureServices(svcs => svcs .AddSingleton<IProcessorMetricsCollector>(fakeMetricsCollector) .AddSingleton<INetworkMetricsCollector>(fakeMetricsCollector) .AddSingleton<IMemoryMetricsCollector>(fakeMetricsCollector) .AddSingleton<IMetricsDeliverer, FakeMetricsDeliverer>() .AddSingleton<IHostedService, PerformanceMetricsCollector>() ) .Build() .Run(); ``` >### 运行测试 ![](https://img.tnblog.net/arcimg/hb/a0f5a94dbd684eb0be557eee39d504bf.png)