- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
经过版本更新,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 实例要等到应用程序结束时才会释放.
。
最后此篇关于【ASP.NETCore】在Mini-API中注入服务的文章就讲到这里了,如果你想了解更多关于【ASP.NETCore】在Mini-API中注入服务的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试测试依赖于其他服务 authService 的服务 documentViewer angular .module('someModule') .service('docu
如果我的网站上线(不要认为它会,目前它只是一个学习练习)。 我一直在使用 mysql_real_escape_string();来自 POST、SERVER 和 GET 的数据。另外,我一直在使用 i
我有以下代码,它容易受到 SQL 注入(inject)的攻击(我认为?): $IDquery = mysqli_query($connection, "SELECT `ID` FROM users W
我一直在自学如何创建扩展,以期将它们用于 CSS 注入(inject)(以及最终以 CSS 为载体的 SVG 注入(inject),但那是以后的问题)。 这是我当前的代码: list .json {
这个简单的代码应该通过 Java Spring 实现一个简单的工厂。然而结果是空指针,因为 Human 对象没有被注入(inject)对象(所以它保持空)。 我做错了什么? 谢谢 配置 @Config
我正在编写一个 ASP.NET MVC4 应用程序,它最终会动态构建一个 SQL SELECT 语句,以便稍后存储和执行。动态 SQL 的结构由用户配置以用户友好的方式确定,具有标准复选框、下拉列表和
首先让我说我是我为确保 SQL 注入(inject)攻击失败而采取的措施的知己。所有 SQL 查询值都是通过事件记录准备语句完成的,所有运算符(如果不是硬编码)都是通过数字白名单系统完成的。这意味着如
这是 SQL 映射声称可注入(inject)的负载: user=-5305' UNION ALL SELECT NULL,CONCAT(0x716b6b7071,0x4f5577454f76734
我正在使用 Kotlin 和 Android 架构组件(ViewModel、LiveData)构建一个新的 Android 应用程序的架构,并且我还使用 Koin 作为我的依赖注入(inject)提供
假设 RequestScope 处于 Activity 状态(使用 cdi-unit 的 @InRequestScope) 给定 package at.joma.stackoverflow.cdi;
我有一个搜索表单,可以在不同的提供商中搜索。 我从拥有一个基本 Controller 开始 public SearchController : Controller { protected r
SQLite 注入 如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚
我可以从什么 dll 中获得 Intercept 的扩展?我从 http://github.com/danielmarbach/ninject.extensions.interception 添加了
使用 NInject 解析具有多个构造函数的类似乎不起作用。 public class Class1 : IClass { public Class1(int param) {...} public
我有一个 MetaManager 类: @Injectable() export class MetaManager{ constructor(private handlers:Handler
我是 Angular 的新手,我不太清楚依赖注入(inject)是如何工作的。我的问题是我有依赖于服务 B 的服务 A,但是当我将服务 A 注入(inject)我的测试服务 B 时,服务 B 变得未定
我正在为我的项目使用 android 应用程序启动、刀柄和空间。我在尝试排队工作时遇到错误: com.test E/WM-WorkerFactory: Could not instantiate co
我不确定这是什么糖语法,但让我向您展示问题所在。 def factors num (1..num).select {|n| num % n == 0} end def mutual_factors
简单的问题,我已经看过这个了:Managing imports in Scalaz7 ,但我不知道如何最小化注入(inject) right和 left方法到我的对象中以构造 \/ 的实例. 我确实尝
在我的 Aurelia SPA 中,我有一些我想在不同模块中使用的功能。它依赖于调用时给出的参数和单例的参数。有没有办法创建一个导出函数,我可以将我的 Auth 单例注入(inject)其中,而不必在
我是一名优秀的程序员,十分优秀!