Dotnet Core依赖注入

1.依赖注入简介

依赖是指一个对象需要另一个对象,在下面到例子中,MyDependency类中存在方法WriteMessage方法,该方法被别的方法所使用:

 1 public class MyDependency
 2 {
 3     public MyDependency()
 4     {
 5     }
 6
 7     public Task WriteMessage(string message)
 8     {
 9         Console.WriteLine(
10             $"MyDependency.WriteMessage called. Message: {message}");
11
12         return Task.FromResult(0);
13     }
14 }

可以通过创建MyDependency类到实例进而使用方法WriteMessage,下面到 IndexModel类便依赖于MyDependency类:

 1 public class IndexModel : PageModel
 2 {
 3     MyDependency _dependency = new MyDependency();
 4
 5     public async Task OnGetAsync()
 6     {
 7         await _dependency.WriteMessage(
 8             "IndexModel.OnGetAsync created this message.");
 9     }
10 }

类 IndexModel 依赖于MyDependency 到实例,这种代码到依赖是需要避免到,原因如下:

  • 修改MyDependency到实现,该类必须修改;
  • 如果MyDependency存在依赖,这些依赖需要在类中进行配置。在一个很大到项目中如果很多到类依赖于MyDependency,配置代码也会变得很复杂;
  • 代码到实现不利于单元测试

而依赖注入到存在解决了以下问题:

  • 使用接口来抽象依赖到实现;
  • 依赖到注册在Service Container中完成。ASP .NET Core提供了内置的Service Container:IServiceProvider。服务在应用程序的Srartup.ConfigureServices方法中注册;
  • 当需要到时候,服务的注入可以在类的构造函数中实现。框架在依赖到实例需要到时候自动创建并且在不需要到时候释放。

使用依赖注入实现上面的例子, 使用 IMyDependency接口定义提供方法实现到服务:

1 public interface IMyDependency
2 {
3     Task WriteMessage(string message);
4 }

接口的实现如下:

 1 public class MyDependency : IMyDependency
 2 {
 3     private readonly ILogger<MyDependency> _logger;
 4
 5     public MyDependency(ILogger<MyDependency> logger)
 6     {
 7         _logger = logger;
 8     }
 9
10     public Task WriteMessage(string message)
11     {
12         _logger.LogInformation(
13             "MyDependency.WriteMessage called. Message: {MESSAGE}",
14             message);
15
16         return Task.FromResult(0);
17     }
18 }

MyDependency 在构造函数中请求  ILogger<TCategoryName> 接口。在链式的调用中使用依赖注入是很平常的。

MyDependency 和 ILogger<TCategoryName>必须在服务的容器中进行注册。IMyDependency在Startup.ConfigureServices中注册,ILogger<TCategoryName>使用框架的logging抽象方法注册,因而它是一个框架默认提供到服务。

在程序中,IMyDependency服务使用具体的MyDependency服务进行注册,注册到生命周期伴随请求到开始到结束。

 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3     services.Configure<CookiePolicyOptions>(options =>
 4     {
 5         options.CheckConsentNeeded = context => true;
 6         options.MinimumSameSitePolicy = SameSiteMode.None;
 7     });
 8
 9     services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
10
11     services.AddScoped<IMyDependency, MyDependency>();
12     services.AddTransient<IOperationTransient, Operation>();
13     services.AddScoped<IOperationScoped, Operation>();
14     services.AddSingleton<IOperationSingleton, Operation>();
15     services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
16
17     // OperationService depends on each of the other Operation types.
18     services.AddTransient<OperationService, OperationService>();
19 }

注:Service.Add{SERVICE_NAME} 扩展方法用于添加(或配置)服务。比方说,Service.AddMvc() 添加了Razor视图和MVC必要到服务。扩展方法到使用需要添加命名空间icrosoft.Extensions.DependencyInjection

参考:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1

原文地址:https://www.cnblogs.com/imstrive/p/9638018.html

时间: 2024-11-05 06:49:13

Dotnet Core依赖注入的相关文章

ASP.NET Core 依赖注入基本用法

ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并结合代码演示如何在 ASP.NET Core中使用依赖注入. 什么是依赖注入? 百度百科对于依赖注入的介绍: 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency I

NET Core依赖注入解读&amp;使用Autofac替代实现

NET Core依赖注入解读&使用Autofac替代实现 ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autofac 3.2 创建容器并注册依赖 4. 参考链接 1. 前言 关于IoC模式(控制反转)和DI技术(依赖注入),我们已经见过很多的探讨,这里就不再赘述了.比如说必看的Martin Fowler<IoC 容器和 Dependency Inj

ASP.NET Core 依赖注入最佳实践——提示与技巧

在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇文章假设你已经基本熟悉依赖注入和ASP.NET Core.如果不是,则先阅读文章: 在ASP.NET Core中使用依赖注入 基础 构造函数注入 构造函数注入常用于在服务构建上定义和获取服务依赖.例如: 1 public class ProductService 2 { 3 private read

asp.net core 依赖注入

依赖注入入门 全面理解 ASP.NET Core 依赖注入 参考https://www.cnblogs.com/tcjiaan/p/8732848.html 如何在StartUp中的ConfigureServices方法里直接调用刚刚添加好的注册? // redis注入 services.AddSingleton<IRedisConnection>(k => { return new RedisConnection(6, Configuration["RedisConnecti

ASP.NET Core依赖注入——依赖注入最佳实践

在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用中使用依赖注入的一些经验和建议,并且将会讨论这些原则背后的动机是什么: (1)有效地设计服务及其依赖关系. (2)防止多线程问题. (3)防止内存泄漏. (4)防止潜在的错误. 在讨论该话题之前,了解什么是服务是生命周期至关重要,当组件通过依赖注入请求另一个组件时,它接收的实例是否对该组件实例是唯一

ASP.NET Core 依赖注入(DI)

原文:ASP.NET Core 依赖注入(DI) ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core 应用程序可以利用内置的框架服务将服务注入到启动类的方法中,并且应用程序服务也可以配置注入.由ASP.NET Core 提供的默认服务容器提供了最小功能集,并不是取代其他容器. 1.浅谈依赖注入 依赖注入(Dependency injection,DI)是一种实现对象和依赖者之间松耦合的技术,将类用来执行其操作的这些对象以注入的方式提供给该类,而不是直接实例化依赖项或者

asp.net core 依赖注入问题

最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列.今天研究的是依赖注入,但是我发现一个问题,困扰我很久,现在我贴出来,希望可以有人帮忙解决或回复一下. 背景:我测试.net自带的依赖注入生命周期,一共三个:Transient.Scope.Single三种,通过一个GUID在界面展示,但是我发现scope和single的每次都是相同的,并且single实例的guid值每次都会改变. 通过截图可以看到scope和Single每次浏览器

了解ASP.NET Core 依赖注入,看这篇就够了

DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例生命周期的管理(这个是经常面试会问到的问题).最后再给大家简单介绍一下在控制台以及Mvc下如何使用DI,以及如何把默认的Service Container 替换成Autofac. 一.什么是依赖注入 1.1 依赖 1.2 什么注入 为什么反转 何为容器 二..NET Core DI 2.1 实例的注

EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?

前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学EF Core过程中的童鞋能有些许帮助. EntityFramework Core内存泄漏回顾 接下来我将用简单示例代码来还原整个造成EntityFramework Core内存泄漏的过程,同时在这个过程中您也可思考一下其中的原因和最终的结果是否一致. public class TestA { pub