.Net6 web API (IOC容器内置)

前沿

内置I0C容器使用

1.分层架构,上层调用下层1
2.具备抽象【接口和抽象类】和实现【普通类】
3.注册抽象和具体之间的关系
4.通过构造函数注入【内置容器仅支持构造函数注入】

 

IOC容器的主要作用是管理应用程序中的各种服务、组件和依赖关系,并在需要时将它们注入到其他组件中。通过IOC容器,我们可以实现解耦、灵活配置和可替换性等优势。

 

注册服务:在应用程序启动时,通过IOC容器的API将服务注册到容器中,告诉容器如何创建和管理这些服务。通常在Program.cs文件中进行注册。

解析依赖:在需要使用服务的地方,通过IOC容器获取服务的实例,而不是直接创建实例。容器会自动解析服务的依赖关系,并创建正确的实例。

使用服务:使用从IOC容器中获取的服务实例来完成相应的业务逻辑。

 

新建项目

 

 interfaces: ITestServiceA
namespace yanfanNet6Interfaces;

public interface ITestServiceA
{
    public string ShowA();
}
TestServiceA
using yanfanNet6Interfaces;

namespace yanfanNet6Services;
public class TestServiceA : ITestServiceA
{
    public TestServiceA()
    {
        Console.WriteLine($"{GetType().Name} 被供找");
        }

    public string ShowA()
    {
        return $"this is from {GetType().FullName} ShowA";
        }

}

 

TestServiceB

using yanfanNet6Interfaces;

namespace yanfanNet6Services;
public class TestServiceB : ITestServiceB
{
    public ITestServiceA _TestServiceA;
    public TestServiceB(ITestServiceA testServiceA)
    {
        _TestServiceA = testServiceA;
        Console.WriteLine($"{GetType().Name} 被构招");
    }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    public string ShowB()
    {
        return $"this is from {GetType().FullName} ShowB 调用{_TestServiceA.ShowA()}" ;
    }

}

  TestServiceB 则是 依赖了 TestService A

 

然后在新建控制器

using System;
using Microsoft.AspNetCore.Mvc;
using yanfanNet6Interfaces;
using yanfanNet6Services;

using yanfanNet6WebApi.Utility.Swagger;

namespace yanfanNet6WebApi.Controllers;

/// <summary>
/// 文件资源
/// </summary>
[ApiController]
[Route("[controller]")]
[ApiVersion("2.0")]
public class IocContainerController : ControllerBase
{

    private readonly ILogger<IocContainerController> _logger;

    private readonly ITestServiceA _ITestServiceA;
    private readonly ITestServiceB _ITestServiceB;
    private readonly IServiceProvider _IServiceProvider;

    public IocContainerController(ILogger<IocContainerController> logger,
        ITestServiceA iTestServiceA, ITestServiceB iTestServiceB, IServiceProvider iServiceProvider)
    {
        _logger = logger;
        _ITestServiceA = iTestServiceA;
        _ITestServiceB = iTestServiceB;
        _IServiceProvider = iServiceProvider;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="iTestServiceBNew"></param>
    /// <param name="iServiceProvider"></param>
    /// <returns></returns>
    [HttpGet()]
    public string ShowA([FromServices] ITestServiceB iTestServiceBNew, [FromServices]
    IServiceProvider iServiceProvider)
    {
        //TestServiceA testServiceA = new TestServiceA();

        ITestServiceB testServiceB1 = _IServiceProvider.GetService<ITestServiceB>();
        ITestServiceB testServiceB2 = iServiceProvider.GetService<ITestServiceB>();
        return _ITestServiceA.ShowA();
    }

    [HttpPost()]
    public string ShowB()
    {
        return _ITestServiceB.ShowB();
    }
}
View Code

然后把2个依赖注入进来

 看这段代码

    [HttpGet()]
    public string ShowA([FromServices] ITestServiceB iTestServiceBNew, [FromServices]
    IServiceProvider iServiceProvider)
    {
        //TestServiceA testServiceA = new TestServiceA();

        ITestServiceB testServiceB1 = _IServiceProvider.GetService<ITestServiceB>();
        ITestServiceB testServiceB2 = iServiceProvider.GetService<ITestServiceB>();
        return _ITestServiceA.ShowA();
    }
/TestServiceA testServiceA = new TestServiceA(); 需要在你的方法里面 这里是直接创建了实例


如果使用这个
在program.cs 文件下 写这个
        #region 注册抽象和具体之间的关系
        builder.Services.AddTransient<ITestServiceA, TestServiceA>();
        builder.Services.AddTransient<ITestServiceB, TestServiceB>();
        #endregion
需要使用服务的地方,通过IOC容器获取服务的实例,而不是直接创建实例

然后再运行就OK了

 

 

在.NET 6 API中,IOC(Inversion of Control)容器是一种用于管理应用程序中依赖关系的机制。

通过IOC容器,我们可以将应用程序中的各种服务、组件和依赖关系注册到容器中,并在需要时从容器中获取实例,从而实现解耦、灵活配置和可测试性等目的。

 

一般来说,IOC容器在.NET 6项目中主要用于以下几个方面:

  1. 依赖注入:IOC容器最主要的作用就是实现依赖注入。通过IOC容器,我们可以将应用程序中的各种服务注入到需要使用它们的地方,而不是在这些地方直接创建实例。这样可以降低组件之间的耦合度,提高代码的可维护性和可测试性。

  2. 解耦业务逻辑:通过将服务注册到IOC容器中,可以将业务逻辑和依赖关系解耦。这样,业务逻辑就可以专注于业务处理,而不用关心具体的依赖关系,从而使代码更加清晰和易于维护。

  3. 控制反转:IOC容器实现了控制反转(IoC),即由容器负责管理对象的创建和生命周期。开发者只需要定义好依赖关系,容器就会负责实例化和注入这些依赖关系,从而实现了控制反转。

在.NET 6项目中,常见的使用IOC容器的场景包括

Web应用程序:在ASP.NET Core中,IOC容器被广泛用于管理应用程序中的服务,包括控制器、中间件、过滤器等。
后台服务:在后台服务(Worker Service)或后台任务中,IOC容器可以帮助管理服务和组件之间的依赖关系,提高代码的模块化和可测试性。
单元测试:在单元测试中,可以使用IOC容器来模拟和注入测试中所需的依赖关系,从而方便进行单元测试。
插件系统:如果项目中涉及到插件系统,可以使用IOC容器来动态加载和管理插件,从而实现可扩展性和灵活性。

 

posted @ 2024-05-16 18:54  -鹿-  阅读(165)  评论(0编辑  收藏  举报