首页 > 其他分享 >.Net Core Console&Dependency injection

.Net Core Console&Dependency injection

时间:2023-03-05 09:14:28浏览次数:59  
标签:Core 服务 Service 容器 Collection var Console Net 控制台

前言

有时候想快速验证一些想法,新建一个控制台来弄,可控制台模板是轻量级的应用程序模板,不具备配置、日志、依赖注入等一些功能。

依赖注入

在Asp.Net Core应用程序中,可以通过依赖注入使用IConfiguration接口来使用配置。而控制台模板十分简单,没有内置依赖注入,应用程序所依赖的功能(如配置)不容易获得。使用IOC(控制反转)容器实现依赖注入简要步骤

  1. 创建Service Collection。
  2. 将服务注册到Service Collection。
  3. Service Collection构建Service Provider。
  4. 使用Service Provider获取服务

安装Nuget包

Install-Package Microsoft.Extensions.DependencyInjection

创建服务容器

需要准备一个Service Collection(服务容器),用来存储服务的注册与从其中获取服务。微软已提供了ServiceCollection类。

https://source.dot.net/#Microsoft.Extensions.DependencyInjection.Abstractions/ServiceCollection.cs,4219db14266c9d57

在Asp.Net Core 源码中,Service Collection在WebHostBuilder中实例化好了。

https://source.dot.net/#Microsoft.AspNetCore.Hosting/WebHostBuilder.cs,c278c6966995108c

BuildCommonServices方法中,完成Service Collection实例化与应用需要的服务注册。

图片

在控制台模板中,需要自己去创建实例。

var services = new ServiceCollection();

服务注册

服务注册到服务容器中时需要指明服务本身的生命周期,有三种设置,全局单例(Singleton),请求内单例(Scope),瞬时(Transient)。以订单服务类作为示例,增加接口类与实现类。

public interface IOrderService
{
    void AutoCancel();
}

public class OrderService : IOrderService
{
    public void AutoCancel()
    {
        Console.WriteLine("Order canceled!");
    }
}

注册到服务容器中,此处使用瞬时的生命周期。

services.AddTransient<IOrderService, OrderService>();

构建服务提供者

通过服务容器转换得到服务提供者,使用已有扩展方法

https://source.dot.net/#Microsoft.Extensions.DependencyInjection/ServiceCollectionContainerBuilderExtensions.cs,346262d4cea1139c

using(var serviceProvider = services.BuildServiceProvider(true))
{
    //...
}

获取服务

可通过服务提供者开辟本次使用的一个范围,再获取IOrderService,从注册的服务中获取对应的服务实例。

using (var serviceProvider = services.BuildServiceProvider(true))
{
    var scope = serviceProvider.CreateScope();
    var orderService = scope.ServiceProvider.GetRequiredService<IOrderService>();
    
    orderService.AutoCancel();
}

如此一来,控制台模板下,也可以使用到服务容器来快速验证一些想法。

2023-03-05,望技术有成后能回来看见自己的脚步

标签:Core,服务,Service,容器,Collection,var,Console,Net,控制台
From: https://www.cnblogs.com/CKExp/p/17179291.html

相关文章

  • K8S CKA 1.26 模拟环境 实验环境(一键导入) Kubernetest v1.26题库
    K8SCKA1.26考试环境,按照CKA最新原题搭建的,模拟环境已集成考题,可直接模拟练习,做题实操。资料包含:2023年3月最新题库+答案解析+考试笔记+模拟环境+技术支持+在线辅导答疑......
  • 【水下图像增强】Enhancing Underwater Imagery using Generative Adversarial Networ
    原始题目EnhancingUnderwaterImageryusingGenerativeAdversarialNetworks中文名称使用GAN增强水下图像发表时间2018年1月11日平台ICRA2018......
  • Net6 EFcore框架介绍
    1、简介EFcore,可用使得开发人员不需要再去关注数据库的实现,全都由代码进行生成这样有利于减少工作量、数据库快速迁移...2、上手搭建架构(这个图是做......
  • minikube搭建Kubernetes环境
    前言Kubernetes一般都运行在大规模的计算集群上,管理很严格,Kubernetes充分考虑到了这方面的需求,提供了一些快速搭建Kubernetes环境的工具。minikube它是一个“迷你”......
  • 在 .NET Core 中使用 Redis 创建分布式锁
    .NETCoreRedis分布式锁,在本文中,我们将讨论如何在.NETCore中使用Redis创建分布式锁。我们在构建分布式系统的时候,会面临多个进程共同处理一个共享资源,由于一次只能......
  • Ethernet II
    数据链路层,以太帧主要有4种格式:EthernetII以太帧EthernetII帧,也称为Ethernetv2帧,是如今局域网里最常见的以太帧,是以太网事实标准。如今大多数的TCP/IP应用(如HTTP、......
  • Net常用类记录
    Encoder类将一组字符转换为一个字节序列Dns类提供简单的域名解析功能。C#获取本机的串口号C#获取本机的串口号  usingSystem.IO.Ports;  //头文件  s......
  • docker启动创建容器时,报错Cannot link to /mysql, as it does not belong to the defa
    启动创建容器时,报错Cannotlinkto/mysql,asitdoesnotbelongtothedefaultnetwork从报错信息看是不属于默认网络分析容器网络通过dockerinspect容器id先......
  • ASP.NET Core 中间件
    中间件是一种装配到应用管道以处理请求和响应的软件。每个组件:选择是否将请求传递到管道中的下一个组件。可在管道中的下一个组件前后执行工作。使用 WebApplicati......
  • 从零带你写netty
    提到netty,我们总会说它是Java语言中网络编程的首选框架?为什么?因为它性能太高了。这也是很多人热衷学习它的原因。也许点进这篇文章的你,就怀着这样的目的。但是,请你认真审......