初识.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的集成化效果,以及自己在业务上的运用,不足之处还请多多指点。

浙公网安备 33010602011771号