第四十九节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2023-06-07 11:47  Yaopengfei  阅读(95)  评论(1编辑  收藏  举报