.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(); } }
然后把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项目中主要用于以下几个方面:
-
依赖注入:IOC容器最主要的作用就是实现依赖注入。通过IOC容器,我们可以将应用程序中的各种服务注入到需要使用它们的地方,而不是在这些地方直接创建实例。这样可以降低组件之间的耦合度,提高代码的可维护性和可测试性。
-
解耦业务逻辑:通过将服务注册到IOC容器中,可以将业务逻辑和依赖关系解耦。这样,业务逻辑就可以专注于业务处理,而不用关心具体的依赖关系,从而使代码更加清晰和易于维护。
-
控制反转:IOC容器实现了控制反转(IoC),即由容器负责管理对象的创建和生命周期。开发者只需要定义好依赖关系,容器就会负责实例化和注入这些依赖关系,从而实现了控制反转。
在.NET 6项目中,常见的使用IOC容器的场景包括
Web应用程序:在ASP.NET Core中,IOC容器被广泛用于管理应用程序中的服务,包括控制器、中间件、过滤器等。
后台服务:在后台服务(Worker Service)或后台任务中,IOC容器可以帮助管理服务和组件之间的依赖关系,提高代码的模块化和可测试性。
单元测试:在单元测试中,可以使用IOC容器来模拟和注入测试中所需的依赖关系,从而方便进行单元测试。
插件系统:如果项目中涉及到插件系统,可以使用IOC容器来动态加载和管理插件,从而实现可扩展性和灵活性。