当前位置: 首页 > article >正文

C# MAUI 注册服务

MAUI 支持多个平台,如Android 、IOS、MAC等

有些数据的获取,每个平台都不一样,如果想在公共代码中,能根据平台的不同,调用相同的接口去实现数据获取,可以按下面介绍的方式进行设计

示例:获取当前的IP地址

定义 接口 ILocalIPAddress

   public interface ILocalIPAddress
   {
       /// <summary>
       /// 获取本地IP
       /// </summary>
       /// <param name="ip"></param>
       /// <returns></returns>
       BaseResult GetLocalIPAddress(out string ip, out string gateway);
       /// <summary>
       /// 获取程序路径
       /// </summary>
       /// <returns></returns>
       string GetBaseDirectory();
   }

在相应的平台下边,实现接口

下面介绍Android端的实现

[assembly: Dependency(typeof(LocalIPAddress))]
namespace LS.GRPCAPP.Platforms.Android.lmpl
{
    public class LocalIPAddress : ILocalIPAddress
    {
        public string GetBaseDirectory()
        {
            return System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);
        }

        /// <summary>
        /// 获取本地IP
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public BaseResult GetLocalIPAddress(out string ip,out string gateway)
        {
            ip = "";
            gateway = "";
            try
            {
                // 获取 WifiManager
                WifiManager wifiManager = (WifiManager)LS.GRPCAPP.MainApplication.Context.GetSystemService(Context.WifiService);

                // 检查WiFi是否启用
                if (wifiManager != null && wifiManager.IsWifiEnabled)
                {
                    // 获取当前连接的WiFi信息
                    WifiInfo wifiInfo = wifiManager.ConnectionInfo;
                    var dhcpInfo = wifiManager.DhcpInfo;

                    // 获取WiFi名称和IP地址
                    string ipAddress = Formatter.FormatIpAddress(wifiInfo.IpAddress);
                    string _gateway = Formatter.FormatIpAddress(dhcpInfo.Gateway);

                    ip = ipAddress;
                    gateway = _gateway;
                    return BaseResult.Successed;
                }
                else
                {
                    return new BaseResult(false, "WiFi is not enabled.");
                }
            }
            catch (Exception ex)
            {
                return new BaseResult(false, "Error: " + ex.Message);
            }
        }
    }
}

然后再启动程序中,按平台分类进行注册服务

            // 根据平台注册服务
#if ANDROID
        builder.Services.AddSingleton<ILocalIPAddress, Platforms.Android.lmpl.LocalIPAddress>();
#elif IOS
        //builder.Services.AddSingleton<ILocalIPAddress, iOSLocalIPAddressService>();
#elif MACCATALYST
        //builder.Services.AddSingleton<ILocalIPAddress, MacLocalIPAddressService>();
#elif WINDOWS
        //builder.Services.AddSingleton<ILocalIPAddress, WindowsLocalIPAddressService>();
#endif

在APP中,启动时注入服务

 public App()
 {
     InitializeComponent();

     MainPage = new AppShell();
     try
     {
         // 初始化依赖注入
         AppPath.Initialize(IPlatformApplication.Current.Services);
         GlobalData.Initialize(IPlatformApplication.Current.Services);
         LogOperate.InitLog(System.Threading.Thread.CurrentThread.ManagedThreadId, AppPath.Path_Logs_AppLog);
     }
     catch (Exception ex)
     {

     }
 }

使用全局类  

 public static class GlobalData
 {
     private static ILocalIPAddress _localIPAddress;

     // 在应用启动时注入服务
     public static void Initialize(IServiceProvider services)
     {
         _localIPAddress = services.GetRequiredService<ILocalIPAddress>();
     }

     /// <summary>
     /// 获取实现接口ILocalIPAddress 的对象
     /// </summary>
     /// <returns></returns>
     public static ILocalIPAddress GetLocalIPAddress()
     {
         return _localIPAddress;
     }
 }

调用方式:

            var res = GlobalData.GetLocalIPAddress().GetLocalIPAddress(out var ip, out string gateway);
            Url = $"http://{gateway}:5237"; //"http://127.0.0.1:5237";
            Service = "Device";
            Method = "GetDeviceInfo";


http://www.kler.cn/a/535303.html

相关文章:

  • 在 Vue Router 中,params和query的区别?
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_sprintf_num 函数
  • 基于SpringBoot的信息技术知识赛系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • Go语言并发之美:构建高性能键值存储系统
  • PyQt6/PySide6 的 QLineEdit 类
  • Spring AI 智能体通过 MCP 集成本地文件数据
  • 如何在本机或服务器上部署运行DeepSeek R1模型
  • 高级java每日一道面试题-2025年01月29日-框架篇[SpringBoot篇]-SpringBoot 实现热部署有哪几种方式?
  • tcp/ip网络协议,tcp/ip网络协议栈
  • RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)
  • Day52:type()函数
  • RocketMQ实战—5.消息重复+乱序+延迟的处理
  • 记录 | WPF基础学习自定义按钮
  • 【matlab代码】平方根扩展卡尔曼滤波(SR EKF)例程,三维非线性系统的滤波
  • 【Rust自学】20.2. 最后的项目:多线程Web服务器
  • 在远程 Linux 服务器上运行 Jupyter Notebook(.ipynb 文件)
  • idea 启动 thingsboard
  • iOS--SDWebImage源码解析
  • 《Node.js Express 框架》
  • Apache Kafka:高吞吐分布式流平台的深度解析
  • 深入解析:Python 爬虫高级技巧与实战应用
  • 前端学习-tab栏切换改造项目(三十一)
  • MATLAB中matches函数用法
  • Mysql表分区后使用主键ID做In查询性能变差分析及解决
  • QT +FFMPEG4.3 拉取 RTMP/http-flv 流播放 AVFrame转Qimage
  • MFC 学习笔记目录