升级核心库,优化 SessionBase.SendMessageAsync,是的WinForm的UI线程调用同步Invoke时,不至于卡住UI上下文
大石头 authored at 2024-11-24 23:44:24
1.89 KiB
NewLife.Remoting
using NewLife.Remoting.Extensions;
using NewLife.Remoting.Extensions.Models;
using NewLife.Remoting.Extensions.Services;
using NewLife.Remoting.Models;
using ZeroServer.Models;

namespace ZeroServer.Services;

/// <summary>IoT扩展</summary>
public static class IoTExtensions
{
    /// <summary>添加IoT客户端服务端架构服务,支持客户端登录、心跳、更新以及指令下发等操作</summary>
    /// <remarks>
    /// 注册登录心跳等模型类,可在此扩展模型类,传输更多内容;
    /// 注册IDeviceService服务,提供登录心跳等基础实现;
    /// 注册TokenService令牌服务,提供令牌颁发与验证服务;
    /// 注册密码提供者,用于通信过程中保护密钥,避免明文传输;
    /// 注册缓存提供者的默认实现;
    /// 注册节点在线后台服务,定时检查节点在线状态;
    /// </remarks>
    /// <param name="services"></param>
    /// <param name="setting"></param>
    /// <returns></returns>
    public static IServiceCollection AddIoT(this IServiceCollection services, ITokenSetting setting)
    {
        ArgumentNullException.ThrowIfNull(setting);

        // 逐个注册每一个用到的服务,必须做到清晰明了
        services.AddSingleton<IDeviceService, NodeService>();

        // 根据项目需要,可以注册 LoginRequest 和 PingRequest 的扩展实现
        services.AddTransient<ILoginRequest, LoginInfo>();
        services.AddTransient<IPingRequest, PingInfo>();

        // 注册Remoting所必须的服务
        services.AddRemoting(setting);

        // 后台服务
        services.AddHostedService<NodeOnlineService>();

        return services;
    }

    /// <summary>使用IoT客户端服务端架构服务,启用WebSocket</summary>
    /// <param name="app"></param>
    public static void UseIoT(this IApplicationBuilder app)
    {
        app.UseRemoting();
    }
}