首页 > 其他分享 >.Net6 web API (IOC容器内置)

.Net6 web API (IOC容器内置)

时间:2024-05-16 18:58:16浏览次数:12  
标签:web 容器 ITestServiceB ITestServiceA API Net6 TestServiceA IOC public

前沿

内置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

相关文章

  • windows 安装.net6core webapi
    windows安装.net6corewebapi:1.下载安装dotnet-hosting-6.0.0-win.exe(Windows HostingBundle--runtime)https://dotnet.microsoft.com/en-us/download/dotnet/6.02..netcorewebapi右键发布publish,复制发布的文件到windows服务器iis站点webapi3.启动windowspowersh......
  • 调用 Magnification API 实现黑屏功能
    调用MagnificationAPI实现NVDA屏幕阅读器的黑屏效果[作者:张赐荣]前言作为读屏软件的开发者,经常需要考虑如何帮助视力障碍者更好地使用计算机。一个常见需求是保护用户的屏幕隐私,避免在操作电脑期间被他人窥视。本文将详细讲解如何使用WindowsMagnificationAPI实现屏......
  • thusc&pkusc&apio游记
    thusc&pkusc&apio游记连打三场赛,真爽。明年可能就没这么爽了。5.10早上航班延误了,在家多睡了一会。我们学校有两个初二的去两个营,因为没有约。我是其中之一,因为我太菜了。syl要一次拿pku和thu的1=约了。飞机上看了下载的视频。下飞机后教练打车带我们去了酒店。然后下午太无......
  • 我发现了字节OpenApi接口的bug!
    本文记录我在对接字节旗下产品火山云旗下云游戏产品OpenApi接口文档时遇到的坑,希望能帮助大家(火山云旗下云游戏产品的文档坑很多,我算是从零到一都踩了一遍,特此记录,希望大家引以为鉴)。1.文档问题很经典的开局一张图,对接全靠问,这里给大家强调下,当要跟第三方产品对接时,一定要......
  • Jenkins: Webhook触发多分支流水线项目构建
    总共发现了两种配置方法,分别是通过不同的插件实现GenericWebhookTrigger安装插件:GenericWebhookTrigger在Jenkinsfile中,添加配置:triggers{GenericTrigger(//构建时的标题causeString:'Triggeredby$ref',//获取POST参......
  • JS — webscoket详解
    一.基本概念WebSocket是一种在Web浏览器和服务器之间建立全双工通信的协议。它允许网页实时地发送和接收数据,而不需要页面刷新或像传统HTTP协议那样的轮询操作。WebSocket使用HTTP协议进行握手,并通过Upgrade头字段指定从HTTP到WebSocket的转换。一旦握手成功,WebSocket连接就会......
  • webpack相关知识点
    一、webpack打包过程。首先读取配置文件,确定入口文件及其依赖关系,然后,从入口文件开始,递归解析所有模块,通过相应的加载器(loaders)处理不同类型的文件内容,如Javascript、css等。接着,使用插件(plugins)执行额外的任务,如代码压缩、环境变量注入等。最后,将处理后的模块按照指定的格式......
  • APIO 游记
    Day-3由于各种原因没报清北营,于是此时下午才坐绿皮火车出发。很久没做过绿皮火车了,有一种怀旧的感觉。但是车上旁边有人一直在打喷嚏,导致全程都不敢摘口罩,睡觉都戴着N95,一晚上没怎么睡。(可能也有原因是在脑子后面构造)吃饭也不敢在这吃,就溜到车厢连接处吃,很怕失手把饭盒翻了,......
  • NuxtJS-Web-开发实用指南-全-
    NuxtJSWeb开发实用指南(全)原文:zh.annas-archive.org/md5/95454EEF6B1A13DFE0FAD028BE716A19译者:飞龙协议:CCBY-NC-SA4.0前言Nuxt.js(本书中将其称为Nuxt)是建立在Vue.js之上的渐进式Web框架(本书中将其称为Vue)用于服务器端渲染(SSR)。使用Nuxt和Vue,构建通用和静态生......
  • nodejs学习07——API
    接口一、简介1.1接口是什么接口是前后端通信的桥梁简单理解:一个接口就是服务中的一个路由规则,根据请求响应结果接口的英文单词是API(ApplicationProgramInterface),所以有时也称之为API接口这里的接口指的是『数据接口』,与编程语言(Java,Go等)中的接口语法不同1.2......