首页 > 编程语言 >【ASP.NET Core】在 Mini-API 中注入服务

【ASP.NET Core】在 Mini-API 中注入服务

时间:2023-10-04 18:55:07浏览次数:40  
标签:Core ASP Mini app sv MyService API 参数 httprepl

经过版本更新,Mini API 的功能逐步完善,早期支持得不太好的 mini API 现在许多特性都可以用了,比如灰常重要的依赖注入。

咱们先来个相当简单的注入测试。来,定义一个服务类,为了偷懒,老周这里就不使用 接口 + 实现类 的方式了。

public class MyService : IDisposable
{
    public MyService()
    {
        Console.WriteLine($"{nameof(MyService)} 隆重开业");
    }

    public void Dispose()
    {
        Console.WriteLine($"{nameof(MyService)} 即将散伙");
    }

    public void DoSomething()
    {
        Console.WriteLine("正忙着呢……别闹");
    }
}

此服务类提供给外部调用的公共方法是 DoSomething。

接下来在容器中注册一下这个服务。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<MyService>();
var app = builder.Build();

毕竟,每个 Web API 的调用都是一次消息往返,所以我选择将服务类注册为范围级别的——请求上下文的范围内存活。

最简单好用的注入方式是让服务类的实例通过参数传入。

app.MapGet("/", (MyService sv) =>
{
    // 调用服务类的公共方法
    sv.DoSomething();
    return "三日成精五日成魔七日成鬼";
});

Web API 测试可以不使用第三方工具,dotnet tool 集合有个叫 httprepl 的工具,可以方便使用。此工具需要安装,命令如下:

dotnet tool install -g microsoft.dotnet-httprepl

安装完成后,直接在命令终端输入 httprepl ,回车。就进入了会话模式。假设应用程序的地址是 https://localhost:7249,可以用 connect 命令建立连接。

connect https://localhost:7249

发起请求时,可以用 get、post、put 等命令,对应 HTTP 的请求方式。在上面的例子中,咱们用的是 MapGet 方法注册的 API,相对路径是 /。

get /

调用成功后会返回文本。

而且,MyService 服务也被调用了。

 

接下来咱们改一下代码,添加一个参数x。

app.MapGet("/", (int x, MyService sv) =>
{
    sv.DoSomething();
    return $"你提交的参数是:{x}";
});

在调用 httprepl 工具时,也可以直接将 URL 作为命令行参数传给它,能省去使用 connect 命令。

httprepl https://localhost:7249

然后调用一下 API 。

get /?x=150

得到的响应如下:

 

从上面的改动可以知道:来自依赖注入的参数能够被识别。当然,咱们也可以明确指定各个参数的来源。

app.MapGet("/", ([FromQuery]int x, [FromServices]MyService sv) =>
{
    sv.DoSomething();
    return $"你提交的参数是:{x}";
});

再次运行,再次发出请求。

get /?x=399

 

注入服务在 POST 请求中也可以和作不 body 的参数一起用,例如:

app.MapPost("/send", (Pet p, MyService sv) =>
{
    // 调用服务
    sv.DoSomething();
    string s = string.Format("宠物ID:{0},大名叫{1}", p.ID, p.Name);
    // 返回文本
    return s;
});

参数 sv 是依赖注入自动赋值的,而参数 p 是 Pet 实例,由HTTP请求的 body 部分提供(默认识别 JSON 格式)。Pet 类定义如下:

public class Pet
{
    public int ID { get; set; }
    public string? Name { get; set; }
}

这个类结构很简单,两个成员,用来测试的,不用在意。

在 HttpRepl 工具中可以用 post /send -h content-type=application/json -c ... 的格式提交,-h 指定 HTTP 头,-c 指定 body 部分。但是,在命令行中用 -c 参数指定 body 很难写,而且老容易出错。最好的做法是配置一个文本编辑器。在编辑器中输入好内容,保存关闭文件,然后 httprepl 工具会自动提交。编辑的文件是临时文件,由工具生成,我们不用管它,只要在输入好内容后保存就行。

文本编辑器用啥都行,如记事本。当然,最好设置 VS Code。操作如下:

先进入 httprepl 会话:

httprepl

接着配置 editor.command.default 参数:

pref set editor.command.default "C:\Users\Bug-PC\tools\VSCode\Code.exe"

设置项名称后面是 VS Code 的路径。然后,它会提示你最好加上 -w 参数,于是输入执行:

pref set editor.command.default.arguments "-w"

-w 参数是可以等待 VS Code 响应——等它编辑完关闭后返回 httprepl 工具。

现在,在 httprepl 会话中用 connect 命令连接服务器。

connect https://localhost:7249

发送 POST 请求。

post /send -h content-type=application/json

注意 Content Type 是 JSON 数据。执行后会启动 VS Code,然后我们输入:

{
    "id": 1234,
    "name": "Jack"
}

完成后记得保存文件,并关闭 VS Code。关闭 VS Code 后回到 httprepl 会话,请求自动发送。

 

如果 mini-API 没有定义接收注入的参数,也可以用 HttpContext 来主动请求服务实例。请看下面代码:

app.MapGet("/", (HttpContext context) =>
{
    // 主动请求服务
    MyService sv = context.RequestServices.GetRequiredService<MyService>();
    sv.DoSomething();
    return "我在这里等了你上万年了!";
});

只要在所绑定的委托/方法中提供 HttpContext 类型的参数,就可以自动注入。随后在方法体中就可以直接引用。

这里要注意:此处咱们不能用 app.Services 去请求服务,因为它引用的是根容器(应用程序最开始创建的),不能访问生生命周期为 Scoped 的服务。

我们尝试把服务注册为单实例,看能不能用 app.Services 来获取。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<MyService>();
var app = builder.Build();

app.MapGet("/", () =>
{
    // 主动请求服务
    MyService sv = app.Services.GetRequiredService<MyService>();
    sv.DoSomething();
    
    return "我在这里等了你上万年了!";
});

运行程序后,在 httprepl 中用 get / 命令测试通过。这说明,单例服务是支持通过 app.Services 获取的。不过,MyService 实例要等到应用程序结束时才会释放。

 

标签:Core,ASP,Mini,app,sv,MyService,API,参数,httprepl
From: https://www.cnblogs.com/tcjiaan/p/17742167.html

相关文章

  • 在不受支持的 Mac 上安装 macOS Sonoma (OpenCore Legacy Patcher)
    在不受支持的Mac上安装macOSSonoma、Ventura、Monterey、BigSur(OpenCoreLegacyPatcher)InstallmacOSonunsupportedMacs请访问原文链接:https://sysin.org/blog/install-macos-14-on-unsupported-mac/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgmacOS......
  • coreldraw是什么软件?2023有哪些功能特色呢?
    很多人都听过CorelDraw的名字,但不知道CorelDraw是什么样的软件。下面就让小编为大家详细介绍一下。coreldraw是什么软件CorelDraw2023是一款专业的图形设计软件。它的主要功能包括矢量图形和位图的编辑。用户可以利用其矢量图形编辑能力,设计各种图标、Logo等精细图形。同时,它也......
  • 使用Aspose.Cell控件实现Excel高难度报表的生成(二)
    继续在上篇《使用Aspose.Cell控件实现Excel高难度报表的生成(一)》随笔基础上,研究探讨基于模板的Aspose.cell报表实现,其中提到了下面两种报表的界面,如下所示: 或者这样的报表格式  首先来分析第一种报表,这个其实还是比较固定的二维表,我们只要绑定相关的信息即可,设计模板如下......
  • 解决交叉编译产生的程序放到目标板上运行时出现Segmentation fault (core dumped)
    原文:https://blog.csdn.net/qq_36219010/article/details/100163134在PC机上编译一段程序:arm-linux-gnueabihf-gcc-ohellohello.c这里产生hello文件用FTP传输到目标板上(树莓派3B+),运行时出现:报告段错误。后来我又试了不输出指定的文件名:arm-linux-gnueabihf-gcchello.c......
  • C. Assembly via Minimums
    C.AssemblyviaMinimums找规律首先根据题意,B组数据的顺序是完全没有关系的,因为可以随意打乱,所以a组的值一定在b组里找,这不是废话。其次我们观察数据可知,最小值出现的次数是n-1,比较好理解的方法是:分别把最小值放在开头和结尾,因为要取最小值所以在B组出现的次数一定是n-1。接......
  • DotNetGuide新增C#/.NET/.NET Core充电站(让你学习不迷路)
    DotNetGuide简介记录、收集和总结C#/.NET/.NETCore基础知识、学习路线、开发实战、学习视频、文章、书籍、项目框架、社区组织、开发必备工具、常见面试题、面试须知、简历模板、以及自己在学习和工作中的一些微薄见解。希望能和大家一起学习,共同进步......
  • aws awswrangler 集成minio 简单试用
    awsawswrangler现在已经改名为aws-sdk-pandas,但是对于python使用的时候安装已经是使用awswrangler名称以下是一个简单的集成minio的测试,核心是配置环境变量,这个也比较符合aws对于相关资源的集成玩法环境准备docker-compose文件 version:'3'services......
  • 在Jupyter中运行Rust(需要安装Minicconda、JupyterLab和Rust)
    安装Miniconda有许多不同的方法可以在一个方便我们工作的环境中启动和运行。我可以推荐的一种方法是安装和使用Miniconda。Miniconda是一个免费的最小安装程序。它是Anaconda的一个小的引导版本,仅包含conda、Python、它们所依赖的包,以及少量其他有用的包,包括pip、zlib和其......
  • mousocoreworker.exe 是 Windows 操作系统中的一个可执行文件。它是 Microsoft OneDri
    mousocoreworker.exe是Windows操作系统中的一个可执行文件。它是MicrosoftOneDrive的一部分,用于处理OneDrive文件同步和管理操作。Mousocoreworker.exe的主要功能如下:文件同步:它负责将本地计算机上的文件与OneDrive云存储进行同步,确保文件的实时更新和备份。文件管......
  • C#/.NET/.NET Core优秀项目和框架2023年9月简报
    前言公众号每月定期推广和分享的C#/.NET/.NETCore优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍、功能特点以及部分截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排......