Gerenciamento de configurações do aplicativo
Gorjeta
Este conteúdo é um excerto do eBook, Enterprise Application Patterns Using .NET MAUI, disponível no .NET Docs ou como um PDF para download gratuito que pode ser lido offline.
As configurações permitem a separação de dados que configuram o comportamento de um aplicativo do código, permitindo que o comportamento seja alterado sem reconstruir o aplicativo. Existem dois tipos de configurações: configurações do aplicativo e configurações do usuário.
As configurações do aplicativo são dados que um aplicativo cria e gerencia. Ele pode incluir dados como pontos de extremidade de serviço Web fixo, chaves de API e estado de tempo de execução. As configurações do aplicativo estão vinculadas à funcionalidade principal e só são significativas para esse aplicativo.
As configurações de usuário são as configurações personalizáveis de um aplicativo que afetam o comportamento do aplicativo e não exigem reajustes frequentes. Por exemplo, um aplicativo pode permitir que o usuário especifique onde recuperar dados e como exibi-los na tela.
Criando uma interface de configurações
Embora o gerenciador de preferências possa ser usado diretamente em seu aplicativo, ele vem com a desvantagem de tornar seu aplicativo firmemente acoplado à implementação do gerenciador de preferências. Esse acoplamento significa que a criação de testes de unidade ou a extensão da funcionalidade do gerenciamento de preferências será limitada, uma vez que seu aplicativo não terá uma maneira direta de intercetar o comportamento. Para resolver essa preocupação, uma interface pode ser criada para funcionar como um proxy para o gerenciamento de preferências. A interface nos permitirá fornecer uma implementação que atenda às nossas necessidades. Por exemplo, ao escrever um teste de unidade, podemos querer definir configurações específicas, e a interface nos dará uma maneira fácil de definir consistentemente esses dados para o teste. O exemplo de código a seguir mostra a ISettingsService
interface no aplicativo multiplataforma eShop:
namespace eShop.Services.Settings;
public interface ISettingsService
{
string AuthAccessToken { get; set; }
string AuthIdToken { get; set; }
bool UseMocks { get; set; }
string IdentityEndpointBase { get; set; }
string GatewayShoppingEndpointBase { get; set; }
string GatewayMarketingEndpointBase { get; set; }
bool UseFakeLocation { get; set; }
string Latitude { get; set; }
string Longitude { get; set; }
bool AllowGpsLocation { get; set; }
}
Adicionando configurações
O .NET MAUI inclui um gerenciador de preferências que fornece uma maneira de armazenar configurações de tempo de execução para um usuário. Esse recurso pode ser acessado de qualquer lugar dentro do seu aplicativo usando a Microsoft.Maui.Storage.Preferences
classe. O gerenciador de preferências fornece uma abordagem consistente, segura para tipos e multiplataforma para persistir e recuperar configurações de aplicativos e usuários, enquanto usa o gerenciamento de configurações nativas fornecido por cada plataforma. Além disso, é simples usar a vinculação de dados para acessar os dados de configurações expostos pela biblioteca. Para obter mais informações, consulte as Preferências no Microsoft Developer Center.
Gorjeta
As preferências destinam-se a armazenar dados relativamente pequenos. Se você precisar armazenar dados maiores ou mais complexos, considere usar um banco de dados ou sistema de arquivos local para armazenar os dados.
Nosso aplicativo usará a Preferences
classe necessária para implementar a ISettingsService
interface. O código abaixo mostra como o aplicativo SettingsService
multiplataforma eShop implementa as AuthTokenAccess
propriedades e UseMocks
:
public sealed class SettingsService : ISettingsService
{
private const string AccessToken = "access_token";
private const string AccessTokenDefault = string.Empty;
private const string IdUseMocks = "use_mocks";
private const bool UseMocksDefault = true;
public string AuthAccessToken
{
get => Preferences.Get(AccessToken, AccessTokenDefault);
set => Preferences.Set(AccessToken, value);
}
public bool UseMocks
{
get => Preferences.Get(IdUseMocks, UseMocksDefault);
set => Preferences.Set(IdUseMocks, value);
}
}
Cada configuração consiste em uma chave privada, um valor padrão privado e uma propriedade pública. A chave é sempre uma cadeia de caracteres const que define um nome exclusivo, com o valor padrão para a configuração sendo um valor estático somente leitura ou constante do tipo necessário. Fornecer um valor padrão garante que um valor válido esteja disponível se uma configuração não definida for recuperada. Esta implementação de serviço pode ser fornecida através de injeção de dependência para a nossa aplicação para utilização em modelos de visualização ou outros serviços em toda a aplicação.
Vinculação de dados às configurações do usuário
No aplicativo multiplataforma eShop, o SettingsView
expõe várias configurações que o usuário pode configurar em tempo de execução. Essas configurações incluem permitir a configuração de se o aplicativo deve recuperar dados de microsserviços implantados como contêineres do Docker ou se o aplicativo deve recuperar dados de serviços fictícios que não exigem uma conexão com a Internet. Ao recuperar dados de microsserviços em contêineres, uma URL de ponto de extremidade base para os microsserviços deve ser especificada. A imagem abaixo mostra o SettingsView quando o usuário optou por recuperar dados de microsserviços em contêineres.
A vinculação de dados pode ser usada para recuperar e definir configurações expostas pela ISettingService
interface. Isso é conseguido por meio de controles na associação de exibição para exibir propriedades do modelo que, por sua vez, acessam propriedades ISettingService
na interface e geram uma notificação de alteração de propriedade se o valor tiver sido alterado.
O exemplo de código a seguir mostra o Entry
controle do que permite que o usuário insira uma URL de ponto de extremidade de SettingsView
identidade base para os microsserviços em contêiner:
<Entry Text="{Binding IdentityEndpoint, Mode=TwoWay}" />
Esse Entry
controle se liga à IdentityEndpoint
propriedade da SettingsViewModel
classe, usando uma associação bidirecional. O exemplo de código a seguir mostra a IdentityEndpoint
propriedade:
private readonly ISettingsService _settingsService;
private string _identityEndpoint;
public SettingsViewModel(
ILocationService locationService, IAppEnvironmentService appEnvironmentService,
IDialogService dialogService, INavigationService navigationService, ISettingsService settingsService)
: base(dialogService, navigationService, settingsService)
{
_settingsService = settingsService;
_identityEndpoint = _settingsService.IdentityEndpointBase;
}
public string IdentityEndpoint
{
get => _identityEndpoint;
set
{
SetProperty(ref _identityEndpoint, value);
if (!string.IsNullOrWhiteSpace(value))
{
UpdateIdentityEndpoint();
}
}
}
Quando a IdentityEndpoint
propriedade é definida, o UpdateIdentityEndpoint
método é chamado, desde que o valor fornecido seja válido. O exemplo de código a seguir mostra o UpdateIdentityEndpoint
método:
private void UpdateIdentityEndpoint()
{
_settingsService.IdentityEndpointBase = _identityEndpoint;
}
Esse método atualiza a IdentityEndpointBase
propriedade na implementação da ISettingService
interface com o valor de URL do ponto de extremidade base inserido pelo usuário. Se a SettingsService
classe for fornecida como a implementação para _settingsService
, o valor persistirá para armazenamento específico da plataforma.
Resumo
As configurações permitem a separação de dados que configuram o comportamento de um aplicativo do código, permitindo que o comportamento seja alterado sem reconstruir o aplicativo. As configurações do aplicativo são dados que um aplicativo cria e gerencia, e as configurações do usuário são as configurações personalizáveis de um aplicativo que afetam o comportamento do aplicativo e não exigem reajustes frequentes.
A Microsoft.Maui.Storage.Preferences
classe fornece uma abordagem consistente, segura para tipos e multiplataforma para persistir e recuperar configurações de aplicativos e usuários.