初识.net.core下的DI服务,谈谈自己对其的了解

 

一.浅谈个人.net经历

        作为一个半路出家的程序员,刚开始接触.net都是基于.net.framework的框架下,那时候做WMS系统开发,基于WCF也就是通用的接口服务,将服务本地化,生成接口供客户端调用。整体的服务模式为C/S模式,没用互联网模式下接口的管理以及熔断、健康检查等保障机制。后来随着工作的深入,渐渐了解到接口服务机制,接口注册中心。公司业务扩展,也让自己在原有CRUD的基础上了解到了B/S框架。整体的模式还是用的.NET.framework框架,自研的HSF以及SG框架,快速集成化接口,在接口注册中心只需要指定dll得路径,通过加载程序集的方式,去获取程序的函数,实现接口的注入激活,随着公司业务的发展以及部署的云端化,说的实在点就是微软爸爸给力,推动.net.core的力度加强。公司将部分服务从.net.framew向.net.core迁移,因为个人原因没加入,错失跟着微软大牛后面学习的机会。好了废话不多说,下面讲点实在点,因为微服务的兴起,.net跨平台的实现,以及微软虚拟机 Hyper_V在Windows10 以后的直接部署都让dockers可以直接微软系统上得到了实现。我刚开始接触,其实我理解的docker就是将虚拟机中的服务镜像化管理,有点类似与centos系统下看看各个服务,docker客户端很友好,鄙人还是习惯在Powershell中用命令查看,程序员装逼心理吧。。回到.net.core服务下继续开始说说自己的了解吧。

二.DI的个人理解

      就先从框架设计中谈及最多的DI-Dependency Injection说起,依赖注入,我相信网上很多大牛的对DI的What/How/Why都有了详细的说明,我只是学习一下并且在自己的认识下,浅谈一下对DI的理解。

      从服务层面解析:

       BaseService 依赖服务A以及服务B,在常规的操作下,BaseService中会对A/B 进行实例化操作,用小白的方式就是new一个新的对象,让他在BaseService中得以实现,从中new一个A也就是强依赖转变为弱依赖的方式,高度集成化的spring就可以实现。本次我还是更像说明白DI的应用层面。DI实际上的作用从主动生成服务A/B,变成被动接受A/B,实例化BaseService的过程中,A/B自动在BaseService实现了实例化。既然说到了DI,就自然而然的说说微软为我们开发人员制造的“轮子”-Microsoft.Extensions.DependencyInjection。将在过程中需要的服务以接口的形式注入到DI容器当中。

构造基础函数:

public class DIHelper
{ private static readonly object locker = new object(); private static ServiceCollection serviceCollection; public static ServiceCollection ServiceCollection { get { lock (locker) { if (serviceCollection == null) { serviceCollection = new ServiceCollection(); } } return serviceCollection; } set { value = serviceCollection; } } private DIHelper(){ } }

实现注入的模式:

var service = DIHelper.ServiceCollection;
#region 实例化注入过程
service.AddSingleton<ServiceDemo.IServiceA>(new ServiceA(new Guid()));
service.AddSingleton<ServiceDemo.IServiceB>(new ServiceB(new Guid()));
service.AddSingleton<IBaseService>(new BaseService(service.BuildServiceProvider())); //注入的过程
#endregion
public class BaseService: IBaseService
{
        public IServiceA serviceA 
        {
            get
            {return provider.GetService<IServiceA>();} 
        }
        public IServiceB serviceB
        { 
            get
            { return provider.GetService<IServiceB>();}
        }
        private ServiceProvider provider;
        public ServiceProvider InstanceProvider => provider;
        public BaseService()
        {}
        public BaseService(ServiceProvider _provider)
        {
            provider = _provider;
        }
        public void ShowResult()
        {
            serviceA.Version();
            serviceB.Version();
        }
}
#region  获取服务
var provider = service.BuildServiceProvider();
var baseService = provider.GetService<IBaseService>(); baseService.ShowResult();
#endregion

 实例化获取服务过的过程

从容器中获取服务是用接口来承载实现的过程,在我个人的理解当中就是服务层面的ORM。

生命周期

有了实现过程,那肯定也有DI的固有生命周期,网上很多地方都有了详细的解析,肯定比我说的清楚多了。

  • Singleton

         单例模式,服务在第一次请求时被创建,其后的每次请求都沿用这个已创建的服务。我们不用再自己写单例了。多次获取容器中的对象,其实是同一个服务。而且后注入的会将原先注入的进行覆盖。

  • Scoped

     作用域模式,服务在每次请求时被创建,整个请求过程中都贯穿使用这个创建的服务。比如Web页面的一次请求。没有模拟场景。

  • Transient

   瞬态模式,服务在每次请求时被创建,它最好被用于轻量级无状态服务,每次向provider获取服务的时候,容器都相当与根据接口实例化一个新的对象注入到当中。

 

 

 最后说一下Aps.net.core下控制器高度集成DI

     Startup中的Configure()函数中,参数列表已经将Microsoft.Extensions.DependencyInjection.IServiceCollection 包含在其中;接口的注入如下所示:

 public void ConfigureServices(IServiceCollection services)
 {
  services.AddRazorPages(); services.AddTransient<IEmailService, DummyEmailService>(); }

 在控制器函数中,只需要重写构造函数,将依赖的服务以接口的实行注入其中,那么在Control就是得到实现;

    [ApiController]
    [Route("api/[controller]")]
    public class ForecastController: Controller
    {
        private readonly IEmailService emailService;

        public ForecastController(IEmailService _emailService)
        {
            emailService = _emailService;
        }
        [HttpGet("GetIndex")]
        public ActionResult GetIndex()
        {
            emailService.SendEmail("ForeCast",DateTime.Now.ToString());
            return Ok("ok");
        }
}

 个人本次的总结就到这吧,下次总结一下Autofac对DI的集成化效果,以及自己在业务上的运用,不足之处还请多多指点。

 

 

 

 

 

 

    

 

   

 

posted @ 2022-02-19 22:41  奔跑的菜鸡鹏鹏  阅读(35)  评论(1)    收藏  举报