ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

asp.net core 依赖注入 实例化对象实例

2026/9/21 12:43:12 拓冰建站 浏览量
asp.net core 依赖注入 实例化对象实例

        在面向对象编程中,推荐使用面向接口编程,这样我们的代码就依赖于服务接口,而不是依赖于实现类,可以实现代码解耦


名称解释:

        我们把负责提供对象的注册和 获取功能的框架叫作“容器”,

        注册到容器中的对象叫作“服务”(service);

        依赖注入(dependency injection,DI):假设框架中有一个自动为类的属性赋值的功能,只要在代码中 通过属性声明说明我们需要什么类型的对象,框架就会创建这个对象。

        控制反转(inversion of control,IoC)是设计模式中非常重要的思想,而依赖注入 (dependency injection,DI)是控制反转思想的一种重要的实现方式。

        控制反转的目的就是把“创建和组装对象”操作的控制权从业务逻辑的代码中转移到框架 中,这样业务代码中只要说明“我需要某个类型的对象”,框架就会帮助我们创建这个对象。

        控制反转就是把“我创建对象”,变成“我要对象”

        实现控制反转的时候,我 们可以采用依赖注入或者服务定位器两种方式。


        因此在使用依赖注入的时候,推荐服务类型用接 口类型。

        在获取服务之前,需要先注册服务,所以我们先要创建用于注册服务的容器

核心组件:

        在.Net Core中的DI核心分为两个组件:IServiceCollectionIServiceProvider

  • IServiceCollection负责注册
  • IServiceProvider负责提供实例

比如:

        在注册服务的时候,可以设定服务类型和实现类型都是 SqlConnection, 这样在获取 SqlConnection 类型服务的时候,容器就会返回注册的 SqlConnection 类型的对象;
        也可以在注册服务的时候,设定服务类型是 IDbConnection,实现类型是 SqlConnection,这样 在获取 IDbConnection 类型服务的时候,容器就返回注册的 SqlConnection 类型的对象。


实例代码如下:

    /// <summary>/// 接口定义/// </summary>public interface IClass5{void Dosomething();}/// <summary>/// 接口类的具体实现类/// </summary>public class Class5: IClass5{readonly ILogger<Class5> CurLogger;public Class5(ILogger<Class5> logger){CurLogger = logger;}public void Dosomething(){CurLogger.LogWarning("告警日志");CurLogger.LogError("错误日志");CurLogger.LogInformation("Jim , age:20");try{int i = int.Parse("abc");}catch (Exception ex){CurLogger.LogError(ex, "解析字符串int失败");}}}
using NbsDemo;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;namespace ConsoleApp5
{internal class Program{static void Main(string[] args){//创建容器ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder =>{logBuilder.AddConsole();});//注册服务//要注册的服务是【DemoLogging.IClass5】,要求容器返回【 DemoLogging.Class5】类型的对象services.AddScoped<DemoLogging.IClass5, DemoLogging.Class5>();using (var scope = services.BuildServiceProvider()){//获取服务要求的类型对象var tempObj = scope.GetRequiredService<DemoLogging.IClass5>();//调用对象的方法tempObj.Dosomething();}Console.WriteLine("\npress any key to end...");Console.ReadLine();Console.WriteLine();} } 
}