前沿
内置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了
标签:web,容器,ITestServiceB,ITestServiceA,API,Net6,TestServiceA,IOC,public From: https://www.cnblogs.com/yf-html/p/18196099