河南焦作地图:ASP.NET Core技术研究-探秘依赖注入框架

时间:6个月前   阅读:35

ASP.NET Core(在)底层内置了“一”个依赖注入框架,“ 通过[依赖注入的方式注”册 「《《 ‘({ 『〖服务〗』[})’[》》」[、提供 「《《 ‘({ 『〖服务〗』[})’[》》」[。依赖注入不仅 「《《 ‘({ 『〖服务〗』[})’[》》」[于ASP.NET Core『自身』,〖“同”时〗也是应用程序的 「《《 ‘({ 『〖服务〗』[})’[》》」[提供者。

「《绝不夸张的》说」,ASP.NET Core 通过[依赖注入实现了种种[ 「《《 ‘({ 『〖服务〗』[})’[》》」[工具的注册和建立,《〖“同”时〗也实现了面向抽》《象的编程模式和编程体验》,提升了应用程序的扩展性。

【今天】,我们普及“一”下ASP.NET Core《中依赖注入的“一”些基本知识》。

“一”、 「《《 ‘({ 『〖服务〗』[})’[》》」[的注册

   我们 通过[建立“一”个ASP.NET Core〖的项目〗,‘(可‘以’发)现(在)’Startup.cs {类}中,“有“一”个”方式ConfigureServices,【这个方式的注】释是这样的:

     This method gets called by the runtime. Use this method to add services to the container.

   

  (在)ConfigureServices方式中我们可‘以’将 通过[ASP.NET Core内置的依赖注入框架实现 「《《 ‘({ 『〖服务〗』[})’[》》」[“的的注册”。

  “这个方式有个参数”:IServiceCollection,见名知意, 「《《 ‘({ 『〖服务〗』[})’[》》」[「聚」集。

  ASP.NET Core内置的依赖注入框架将 「《《 ‘({ 『〖服务〗』[})’[》》」[注册信息存储到“一”个实现了IServiceCollection接口的工具中。默认情况下这个接口的实现{类}是ServiceCollection,【‘以’下是这个{类}的说明】:

  https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.servicecollection?view=dotnet-plat-ext-3.1

  通过[这个接口和{类}实现,我们(可‘以’发)现,注册 「《《 ‘({ 『〖服务〗』[})’[》》」[实(在)就是将“一”个 「《《 ‘({ 『〖服务〗』[})’[》》」[的ServiceDescriptor<工具添>加到ServiceCollection“「聚」”集中。

  例如:

public void ConfigureServices(IServiceCollection services)
{
    services.Add(new ServiceDescriptor(typeof(IUserRepository), new UserRepository()));
    services.AddControllers();
}

   ServiceDescriptor可‘以’明白为对某个 「《《 ‘({ 『〖服务〗』[})’[》》」[「注册项的形貌」。ASP.NET Core『的依赖注入容器』IServiceProvider 通过[ServiceDescriptor的信息,动态建立 「《《 ‘({ 『〖服务〗』[})’[》》」[(的实例)Instance. 

   我们看“一”下这个ServiceDescriptor{类}:

   

   「有几个要害的属性」:

     1. ServiceType: 「《《 ‘({ 『〖服务〗』[})’[》》」[的{类}型,例如 「《《 ‘({ 『〖服务〗』[})’[》》」[接口的{类}型信息

     2. ImplementationType: 「《《 ‘({ 『〖服务〗』[})’[》》」[的实现{类}型,例如 「《《 ‘({ 『〖服务〗』[})’[》》」[接口实现{类}的{类}型信息

     3. ImplementationInstance:实现 「《《 ‘({ 『〖服务〗』[})’[》》」[(的实例),“一”样平常是 「《《 ‘({ 『〖服务〗』[})’[》》」[『单例』模式场景下使用。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.servicedescriptor.-ctor?view=dotnet-plat-ext-3.1#Microsoft_Extensions_DependencyInjection_ServiceDescriptor__ctor_System_Type_System_Object_

    4. Lifetime: 「《《 ‘({ 『〖服务〗』[})’[》》」[生命周期:Scoped(同“一”〖个请求〗中同“一”个IServiceProvider提供的工具是同“一”个)、Singleton(『单例』)、Transient(每次从 「《《 ‘({ 『〖服务〗』[})’[》》」[容器举行请求时建立)

    5. ImplementationFactory 「《《 ‘({ 『〖服务〗』[})’[》》」[实例建立工厂,自定义的IServiceProvider 「《《 ‘({ 『〖服务〗』[})’[》》」[提供容器

  「《《 ‘({ 『〖服务〗』[})’[》》」[注册提供了“一”系列重载的方式,人人可‘以’凭据需要举行选择:

  

      「《《 ‘({ 『〖服务〗』[})’[》》」[注册的过程中,涉及到了 「《《 ‘({ 『〖服务〗』[})’[》》」[‘的生命周期的观点’,接下来我们详细看“一”下。

{二}、 「《《 ‘({ 『〖服务〗』[})’[》》」[生命周期

    「《《 ‘({ 『〖服务〗』[})’[》》」[的生命周期设置,决议了 「《《 ‘({ 『〖服务〗』[})’[》》」[提供容器IServiceProvider使用什么样的方式提供 「《《 ‘({ 『〖服务〗』[})’[》》」[实例工具。正如上面第“一”章节所说的,

   ASP.NET Core 「《《 ‘({ 『〖服务〗』[})’[》》」[依赖注入框架,支持三种{类}型的 「《《 ‘({ 『〖服务〗』[})’[》》」[生命周期:

  •    Singleton
  •    Scoped
  •    Transient

  <其中>:

   Transient:「暂时的」,每次从 「《《 ‘({ 『〖服务〗』[})’[》》」[容器举行请求时建立。 这种生存期适合轻量级、 无状态的 「《《 ‘({ 『〖服务〗』[})’[》》」[。

   Singleton:‘ 单“一”实例[’,(在)第“一”次请求时((或者(在)运行) Startup.ConfigureServices 《而且使用》 「《《 ‘({ 『〖服务〗』[})’[》》」[注册指定实例时)建立的。每个后续请求都使用相同(的实例)。

   Scoped:范围内的,“作用”域生存期 「《《 ‘({ 『〖服务〗』[})’[》》」[,『‘以’每个客户端请求』(【毗邻】)“一”次的方式建立。{可‘以’这么明白}:同“一”〖个请求〗中同“一”个IServiceProvider提供的工具是同“一”个。

   微软给了个例子不错:先注册 「《《 ‘({ 『〖服务〗』[})’[》》」[,三种{类}型

public void ConfigureServices(IServiceCollection services)
{    
services.AddRazorPages();
services.AddScoped<IMyDependency, MyDependency>(); services.AddTransient<IOperationTransient, Operation>(); services.AddScoped<IOperationScoped, Operation>(); services.AddSingleton<IOperationSingleton, Operation>(); services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty)); //OperationService depends on each of the other Operation types. services.AddTransient<OperationService, OperationService>(); }

  【第“一”】〖个请求〗:       

控制器操作:
【‘暂’『时性』】:d233e165-f417-469b-a866-1cf1935d2518
‘(‘作用域’)’:5d997e2d-55f5-4a64-8388-51c4e3a1ad19
‘ 单“一”实例[’:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

OperationService 操作:
【‘暂’『时性』】:c6b049eb-1318-4e31-90f1-eb2dd849ff64
‘(‘作用域’)’:5d997e2d-55f5-4a64-8388-51c4e3a1ad19
‘ 单“一”实例[’:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

  第{二}〖个请求〗:

第{二}〖个请求〗:
控制器操作:
【‘暂’『时性』】:b63bd538-0a37-4ff1-90ba-081c5138dda0
‘(‘作用域’)’:31e820c5-4834-4d22-83fc-a60118acb9f4
‘ 单“一”实例[’:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

OperationService 操作:
【‘暂’『时性』】:c4cbacb8-36a2-436d-81c8-8c1b78808aaf
‘(‘作用域’)’:31e820c5-4834-4d22-83fc-a60118acb9f4
‘ 单“一”实例[’:01271bc1-9e31-48e7-8f7c-7261b040ded9
实例:00000000-0000-0000-0000-000000000000

   人人可‘以’凭据现实的需要选择 「《《 ‘({ 『〖服务〗』[})’[》》」[的生命周期,建立差别{类}型的 「《《 ‘({ 『〖服务〗』[})’[》》」[。

三、 「《《 ‘({ 『〖服务〗』[})’[》》」[的消费

  ( 前面[),〖我〗们将 「《《 ‘({ 『〖服务〗』[})’[》》」[『注册到』IServiceCollection,ASP.NET Core 「《《 ‘({ 『〖服务〗』[})’[》》」[提供容器IServiceProvider就可‘以’凭据IServiceCollection 建立详细{类}型的 「《《 ‘({ 『〖服务〗』[})’[》》」[工具了。

  我们先看“一”下IServiceProvider接口,(可‘以’发)现:只有“一”个GetService方式。

  

 

  我们可‘以’ 通过[‘以’下代码使用:

 public static void Main(string[] args)
 {
      var builder = CreateHostBuilder(args);            
      var host = builder.Build();

      var userRepo = host.Services.GetService(typeof(IUserRepository)) as IUserRepository;
      userRepo.AddUser("user");

      host.Run();
 }

 〖“同”时〗,我们更多常用的是:

 将 「《《 ‘({ 『〖服务〗』[})’[》》」[ 通过[ASP.NET Core依赖注入框架注入到控制器中

 ASP.NET Core MVC 控制器 通过[组织函数{显式请求依赖}关系。『即』: 通过[组织函数注入 「《《 ‘({ 『〖服务〗』[})’[》》」[的实现。

 ( 前面[),我们 通过[ConfigureServices注册了 「《《 ‘({ 『〖服务〗』[})’[》》」[IUserRepository,(在)Controller这“一”层若何消费使用这个 「《《 ‘({ 『〖服务〗』[})’[》》」[呢?谜底就是(在)Controller组织函数中注入。

 看“一”段示例代码:(HomeController『 的组织函数中[』,增加了“一”个参数IUserRepository)

  public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;     
        private IUserRepository _userRepository;

        public HomeController(ILogger<HomeController> logger, IUserRepository userRepository)
        {
            _logger = logger;
            _userRepository = userRepository;
        }

        public IActionResult Index()
        {
            _userRepository.AddUser(new User() {  });

            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }

  〖“同”时〗,ASP.NET Core MVC 控制器支持 通过[注解FromServicesAttribute, 将 「《《 ‘({ 『〖服务〗』[})’[》》」[直接注入到Action方式中,「而无需使」《用组织函数注》入:

public IActionResult Index([FromServices] IUserRepository userRepository)
{
     userRepository.AddUser(new User() {  });

     return View();
}

  ASP.NET Core除了支持将 「《《 ‘({ 『〖服务〗』[})’[》》」[注入到控制器,〖“同”时〗《还支持将》 「《《 ‘({ 『〖服务〗』[})’[》》」[依赖注入到视图,可‘以’参考‘以’下链接:

    https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/dependency-injection?view=aspnetcore-3.0

    ‘‘以’’上是对ASP.NET Core依赖注入框架的研究,分享给人人。

 

  周国庆

 2020/4/12

,

『阳光』(在)线

『阳光』(在)线www.jiehuolou888.com(原诚信(在)线)‘现已开放’『阳光』(在)线手机版下载。『阳光』(在)线游戏公平、公开、公正,【用实力赢取信誉】。

上一篇:上海特产:大乐透第20022期前后区各形态综合剖析!

下一篇:泰州人才网:中职》赛前宣布是否延赛 决定权在同盟、不在主队

网友评论