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

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


名称解释:

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

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

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

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

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

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

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


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

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

比如:

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

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


实例代码如下:

cs 复制代码
    /// <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失败");
            }
        }
    }
cs 复制代码
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();
        } 
    } 
} 
相关推荐
码界筑梦坊4 分钟前
173-基于Flask的微博舆情数据分析系统
后端·python·数据分析·flask·毕业设计
井云AI1 小时前
井云智能体封装小程序:独立部署多开版 | 自定义LOGO/域名,打造专属AI智能体平台
人工智能·后端·小程序·前端框架·coze智能体·智能体网站·智能体小程序
Warren982 小时前
Spring Boot 拦截器返回中文乱码的解决方案(附全局优化思路)
java·网络·spring boot·redis·后端·junit·lua
练习时长一年2 小时前
SpringMVC相关自动配置
java·spring boot·后端
Victor3562 小时前
Redis(21)Redis的发布/订阅(Pub/Sub)机制是如何实现的?
后端
Victor3562 小时前
Redis(20) Redis的管道(Pipeline)是如何工作的?
后端
一枚小小程序员哈5 小时前
基于asp.net 的在线餐饮订餐系统的设计与实现/基于c#的网上订餐系统/餐厅管理系统
后端·c#·asp.net
你的人类朋友10 小时前
【Node&Vue】什么是ECMAScript?
前端·javascript·后端
你的人类朋友11 小时前
说说你对go的认识
后端·云原生·go
我崽不熬夜11 小时前
Java中基本的输入输出(I/O)操作:你知道如何处理文件吗?
java·后端·java ee