Post

Maui最佳实践之 应用设置

Maui提供了两种持久化应用配置的方式,首选项机密存储

这里不展开说明了,因为他们的使用方法很简单:

1
2
3
4
5
6
7
Preferences.Set("key". value);
Preferences.Get("key", default);
Preferences.ContainsKey("key");
Preferences.Remove("key");
Preferences.Clear();

// 同样 Preferences 替换成 SecureStorage 就是安全存储的api

应用配置服务

写成服务形式,交给DI容器进行管理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SettingService:ISettingService{
  // 可以声明一些私有的配置项目或者默认值
  private const string UserAccessToken = "user_token";
  // 读写用户登录token的方法
  // 使用机密存储
  public async Task SetUserTokenAsync(UserToken userToken){
    await SecureStorage
      .SetAsync(UserAccessToken, userToken is not null ? JsonSerializer.Serialize(userToken) : string.Empty)
      .ConfigureAwait(false);
  }
  public async Task<UserToken> GetUserTokenAsync(){
    var userToken = await SecureStorage.GetAsync(UserAccessToken).ConfigureAwait(false);
    return string.IsNullOrEmpty(userToken)?default:JsonSerializer.Serialize(userToken);
  }
  // 首选项属性
  public bool UseMocks{
    get=>Preferences.Get(IdUseMocks, UseMocksDefault);
    set=>Preferences.Set(IdUseMocks, value);
  }
}

将该配置服务注册到应用的DI容器中

环境配置

在 eshop 示例中,业务服务包括 购物车、商品列表、订单、身份验证等,他们都有对应的Mock测试版服务。为此,使用 AppEnvironmentService 管理这些业务服务,这样ViewModel通过该环境管理服务来获取业务服务。这样的好处在于,应用可以在状态改变业务服务的来源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public interface IAppEnvironmentService{
  IBasketService BasketService { get; } // 购物车业务
  ICatalogService CatalogService { get; } // 商品列表业务
  IOrderService OrderService { get; } // 订单业务
  IIdentityService IdentityService { get; }
  void UpdateDependencies(bool UseMockServices); // 更改业务依赖
}

public class AppEnvironmentService : IAppEnvironmentService{
	// 业务服务的普通版本和Mock版本 来自依赖注入容器
  private readonly ICatalogService _catalogService;
  private readonly ICatalogService _mockCatalogService;
  public AppEnvironmentService(ICatalogService mockCatalogService, ICatalogService)
}

// MauiProgram.cs
// 先注入其他依赖项
builder.Services.AddSingleton<IAppEnvironmentService, AppEnvironmentService>(
	// 这里传入 环境服务 的初始化方法
  serviceProvider => {
    var requestProvider = serviceProvider.GetRequiredService<IRequestProvider>();
    var fixUriService = serviceProvider.GetRequiredService<IFixUriService>();
    var settingsService = serviceProvider.GetRequiredService<ISettingsService>();
    var identityService = serviceProvider.GetRequiredService<IIdentityService>();

    var aes =
        new AppEnvironmentService(
            new BasketMockService(), new BasketService(identityService, settingsService, fixUriService),
            new CatalogMockService(), new CatalogService(settingsService, requestProvider, fixUriService),
            new OrderMockService(), new OrderService(identityService, settingsService, requestProvider),
            new IdentityMockService(), identityService);

    aes.UpdateDependencies(settingsService.UseMocks);
    return aes;
  }
)
This post is licensed under CC BY 4.0 by the author.