Microsoft.Extensions.DependencyInjection依赖注入

为什么要使用依赖注入

轻松管理类之间的依赖,构建应用时遵循设计原则。确保代码的可维护性和可扩展性。
依赖注入提供了对象创建和生命周期管理的核心能力

具体运用的组件:

接口实现分离模式,抽象包只需要声明,具体包包括具体的实现。意味着我们的组件只需要依赖它的抽象接口,不需要依赖实现。当使用时注入它的具体实现即可。
好处:以后可以任务修改具体实现的内容,不需要更改代码里面的引用逻辑代码。

依赖注入的核心类型

IserviceCollection:负责服务的注册
ServiceDescriptor:每个服务注册时的信息
IserviceProvider:具体的容器,也是由servicecollection build出来的
IserviceScope:表示一个容器的子容器的生命周期
    ######生命周期  是由IserviceScope继承的
    #######单例singleton:整个生命周期都是一致的
    #######作用域 scoped:容器的生存周期内是一致的,二次请求会更新
    #######瞬间 Transient:每次从容器获取对象时都是一个全新的对象

测试声明周期 附代码

先创建不同的生命周期的三个接口和三个类

namespace HostWebDetail
{
    //声明三个接口 测试生命周期 分别为单例,作用域,瞬间
    public interface IMySingletonService
    {
    }
    public interface IMyScopedService
    {
    }
    public interface IMyTransientService
    {
    }

    //声明方法 继承接口
    public class MySingletonService: IMySingletonService
    {
    }
    public class MyScopedService: IMyScopedService
    {
    }
    public class MyTransientService: IMyTransientService
    {
    }
}

然后在startup中依赖注入

      public void ConfigureServices(IServiceCollection services)
        {
            #region 注册服务不同生命周期的服务
            services.AddSingleton<IMySingletonService, MySingletonService>();
            services.AddScoped<IMyScopedService, MyScopedService>();
            services.AddTransient<IMyTransientService, MyTransientService>();
            #endregion
         }

然后在控制器中实现

  [Route("ServiceLifetime")]
        [HttpGet]
        //FromServices从容器里获取我们的对象
        //每个对象输出两次 对比它的变化
        public List<string> GetServiceLifetime(
    [FromServices] IMySingletonService singleton1,
    [FromServices] IMySingletonService singleton2,
    [FromServices] IMyScopedService scoped1,
    [FromServices] IMyScopedService scoped2,
    [FromServices] IMyTransientService transient1,
    [FromServices] IMyTransientService transient2)
        {
            var s = new List<string>();
            s.Add($"singleton1:{singleton1.GetHashCode()}");
            s.Add($"singleton2:{singleton2.GetHashCode()}");
            s.Add($"scoped1:{scoped1.GetHashCode()}");
            s.Add($"scoped2:{scoped2.GetHashCode()}");
            s.Add($"transient1:{transient1.GetHashCode()}");
            s.Add($"transient2:{transient2.GetHashCode()}");
            return s;
        }

执行效果

依赖注入的二种方式:构造函数和formservice

1构造函数:适用于大部分方法都需要该方法的情况下 2 FromService 适用于具体某个接口使用时

posted @   原往  阅读(945)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示