ASP.NET CORE依赖注入全面剖析:明白DependencyInjectionAbstractions的核 ...

打印 上一主题 下一主题

主题 988|帖子 988|积分 2964

弁言

ASP.NET Core中,依赖注入(Dependency Injection, DI)是其核心功能之一。它通过Microsoft.Extensions.DependencyInjection命名空间提供默认的DI容器,实现了松耦合和模块化筹划。在本文中,我们将深入剖析ASP.NET Core的默认DI实现包 DependencyInjectionAbstractions,并通过代码示例展示其工作原理。
什么是依赖注入

依赖注入是一种筹划模式,它允许对象吸取它们的依赖项,而不是在对象内部创建它们的依赖项。这种方式有助于进步代码的可测试性和可维护性。
ASP.NET Core依赖注入概述

ASP.NET Core提供了一个内置的依赖注入框架,位于Microsoft.Extensions.DependencyInjection命名空间。这个框架包罗几个紧张组件:


  • IServiceCollection:用于注册服务。
  • IServiceProvider:用于剖析服务。
  • ServiceDescriptor:描述服务的生命周期和实现方式。
DependencyInjectionAbstractions 包分析

Microsoft.Extensions.DependencyInjection.Abstractions是ASP.NET Core依赖注入的抽象层,界说了DI容器的基础接口和类。紧张包罗以下内容:
IServiceCollection 接口

IServiceCollection接口用于注册应用程序中的服务。它是一个ICollection<ServiceDescriptor>,允许我们添加、删除和查询服务描述符。
  1. public interface IServiceCollection : IList<ServiceDescriptor>, ICollection<ServiceDescriptor>, IEnumerable<ServiceDescriptor>, IEnumerable
  2. {
  3. }
复制代码
示例:注册服务

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3.     services.AddTransient<IMyService, MyService>();
  4.     services.AddScoped<IOtherService, OtherService>();
  5.     services.AddSingleton<IAnotherService, AnotherService>();
  6. }
复制代码
IServiceProvider 接口

IServiceProvider接口用于剖析服务实例。它界说了一个方法GetService,根据服务类型返回服务实例。
  1. public interface IServiceProvider
  2. {
  3.     object GetService(Type serviceType);
  4. }
复制代码
示例:剖析服务

  1. public class MyController : Controller
  2. {
  3.     private readonly IMyService _myService;
  4.     public MyController(IMyService myService)
  5.     {
  6.         _myService = myService;
  7.     }
  8.     public IActionResult Index()
  9.     {
  10.         _myService.DoSomething();
  11.         return View();
  12.     }
  13. }
复制代码
ServiceDescriptor 类

ServiceDescriptor类描述了服务的类型、实现和生命周期。它用于注册服务时,指定服务的详细信息。
  1. public class ServiceDescriptor
  2. {
  3.     public Type ServiceType { get; }
  4.     public Type ImplementationType { get; }
  5.     public object ImplementationInstance { get; }
  6.     public Func<IServiceProvider, object> ImplementationFactory { get; }
  7.     public ServiceLifetime Lifetime { get; }
  8. }
复制代码
示例:自界说服务描述符

  1. var descriptor = new ServiceDescriptor(
  2.     typeof(IMyService),
  3.     typeof(MyService),
  4.     ServiceLifetime.Transient);
  5. services.Add(descriptor);
复制代码
依赖注入的生命周期

ASP.NET Core支持三种紧张的服务生命周期:


  • Transient:每次请求都会创建一个新的实例。
  • Scoped:每个请求创建一个实例,并在请求之间共享。
  • Singleton:应用程序启动时创建一个实例,并在应用程序生命周期内共享。
  1. services.AddTransient<IMyService, MyService>();
  2. services.AddScoped<IMyService, MyService>();
  3. services.AddSingleton<IMyService, MyService>();
复制代码
深入剖析默认DI容器

默认DI容器的实现位于Microsoft.Extensions.DependencyInjection命名空间中。它通过构建ServiceProvider来剖析服务,并通过内部的ServiceProviderEngine来管理服务的创建和生命周期。
  1. var serviceProvider = services.BuildServiceProvider();
  2. var myService = serviceProvider.GetService<IMyService>();
复制代码
ServiceProvider 类

ServiceProvider类实现了IServiceProvider接口,负责剖析服务实例。
  1. public class ServiceProvider : IServiceProvider, IDisposable, IAsyncDisposable
  2. {
  3.     public object GetService(Type serviceType)
  4.     {
  5.         // 内部实现略
  6.     }
  7. }
复制代码
ServiceProviderEngine 类

ServiceProviderEngine类是DI容器的核心引擎,负责管理服务的创建和生命周期。
  1. public abstract class ServiceProviderEngine
  2. {
  3.     public abstract object GetService(Type serviceType);
  4. }
复制代码
结论

ASP.NET Core的依赖注入框架通过Microsoft.Extensions.DependencyInjection.Abstractions提供了一套灵活且易于利用的DI机制。本文通过分析其核心接口和类,展示了默认DI容器的工作原理。通过这些知识,开辟者可以更好地利用依赖注入,进步应用程序的可维护性和可测试性。
附录:完备代码示例

  1. public interface IMyService{    void DoSomething();}public class MyService : IMyService{    public void DoSomething()    {        Console.WriteLine("MyService is doing something.");    }}public void ConfigureServices(IServiceCollection services){    services.AddTransient<IMyService, MyService>();}public class MyController : Controller
  2. {
  3.     private readonly IMyService _myService;
  4.     public MyController(IMyService myService)
  5.     {
  6.         _myService = myService;
  7.     }
  8.     public IActionResult Index()
  9.     {
  10.         _myService.DoSomething();
  11.         return View();
  12.     }
  13. }
复制代码

盼望这篇博客文章可以或许帮助您更好地明白和利用ASP.NET Core的依赖注入机制。如果有任何题目或需要进一步的解释,请留言告诉我。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表