第四十九节:Core7.0中变化(DI参数自动绑定、signalR变化)
一. 变化1
(详见:https://learn.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-7.0?view=aspnetcore-7.0)
1. DI进行参数自动绑定
当类型被配置为服务时(即AddSingleton/AddScope注入),API 控制器操作的参数绑定通过依赖关系注入绑定参数。 这意味着不再需要将 [FromServices] 属性显式应用 或者 构造函数注入了。
注册代码:
builder.Services.AddSingleton<IDateTime,MyDateTime>();
调用代码:
[Route("api/[controller]/[action]")]
[ApiController]
public class HomeController : ControllerBase
{
/// <summary>
/// 获取日期
/// </summary>
/// <param name="dt">注入时间接口(不再需要构造函数注入 或者 [FromService])</param>
/// <returns></returns>
[HttpPost]
public string GetMsg(IDateTime dt,string msg="我是ypf")
{
return dt.GetNowTime().ToString("yyyy-MM-dd HH:mm:ss")+"----"+msg;
}
}
注: 如果注入参数的类型恰好就是方法接受参数的类型(非常少见,要避免),则可以禁止这种自动绑定, options.DisableImplicitFromServicesParameters = true; 详见program
//禁止注入的参数的自动绑定
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.DisableImplicitFromServicesParameters = true;
});
2. signalR的改动
(1). 客户端
服务器现在支持从客户端请求结果。 这要求服务器使用 ISingleClientProxy.InvokeAsync,并且客户端从其 .On 处理程序返回结果。 强类型中心还可以从接口方法返回值。
(即:服务端可以调用客户端的方法,获取客户端返回的结果,但是客户端必须使用on来处理!!)
客户端代码:
hubConnection.on("GetMessage", async () => {
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("message");
}, 100);
});
return promise;
});
服务端代码:
(2). SignalR 中心方法的依赖项注入
SignalR 中心方法(hub中的方法)现在支持通过依赖项注入 (DI) 注入服务。
中心构造函数可以接受 DI 中的服务作为参数,这些参数可以存储在类的属性中,以便在中心方法中使用。
代码分享(用到上述DI的自动注入)services.AddSingleton<IDatabaseService, DatabaseServiceImpl>();
// ...
public class ChatHub : Hub
{
public Task SendMessage(string user, string message, IDatabaseService dbService)
{
var userName = dbService.GetUserName(user);
return Clients.All.SendAsync("ReceiveMessage", userName, message);
}
}
PS:如果不需要隐式解析服务中的参数,请使用 DisableImplicitFromServicesParameters 禁用它。 若要在中心方法中显式指定从 DI 解析的参数,请使用 DisableImplicitFromServicesParameters
选项,并使用 [FromServices]
属性或自定义属性,该属性在应从 DI 解析的中心方法参数上实现 IFromServiceMetadata
。
services.AddSingleton<IDatabaseService, DatabaseServiceImpl>();
services.AddSignalR(options =>
{
options.DisableImplicitFromServicesParameters = true;
});
// ...
public class ChatHub : Hub
{
public Task SendMessage(string user, string message,
[FromServices] IDatabaseService dbService)
{
var userName = dbService.GetUserName(user);
return Clients.All.SendAsync("ReceiveMessage", userName, message);
}
}
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。