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";