您现在的位置是:首页 >技术教程 >C# MAUI 注册服务网站首页技术教程
C# MAUI 注册服务
                简介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"; 
 
                风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。
        
    
        
    
            




U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结