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.