Compartilhar via


Gerenciamento de configurações de aplicativos

Dica

Esse conteúdo é um trecho do livro eletrônico, Padrões de Aplicativo Empresarial Usando .NETMAUI, disponível em .NET Docs ou em PDF para download gratuito que pode ser lido off-line.

Miniatura da capa do livro eletrônico MAUI Padrões de aplicativo empresarial usando .NET.

As configurações permitem a separação de dados que configura o comportamento de um aplicativo do código, permitindo que o comportamento seja alterado sem recompilar o aplicativo. Há dois tipos de configurações: configurações de aplicativo e configurações de 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 fixos, chaves de API e estado de runtime. As configurações do aplicativo estão vinculadas à funcionalidade principal e só são significativas para esse aplicativo.

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 ajustes frequentes. Por exemplo, um aplicativo pode permitir que o usuário especifique onde recuperar dados e como exibi-los na tela.

Criação de 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, pois seu aplicativo não terá uma maneira direta de interceptar 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 se ajuste às nossas necessidades. Por exemplo, ao escrever um teste de unidade, talvez queiramos 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 interface ISettingsService 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; }
}

Adição de configurações

O .NET MAUI inclui um gerenciador de preferências que fornece uma maneira de armazenar configurações de runtime para um usuário. Esse recurso pode ser acessado de qualquer lugar em seu aplicativo usando a classe Microsoft.Maui.Storage.Preferences. O gerenciador de preferências fornece uma abordagem consistente, fortemente tipada e multiplataforma para persistir e recuperar configurações de aplicativo e usuário, ao mesmo tempo em que usa o gerenciamento de configurações nativas fornecido por cada plataforma. Além disso, é simples usar a associação de dados para acessar dados de configurações expostos pela biblioteca. Para obter mais informações, consulte Preferências no Centro de Desenvolvedores do Microsoft.

Dica

As preferências destinam-se ao armazenamento de dados relativamente pequenos. Se você precisar armazenar dados maiores ou mais complexos, considere usar um banco de dados local ou um sistema de arquivos para armazenar os dados.

Nosso aplicativo usará a classe Preferences necessária para implementar a interface ISettingsService. O código abaixo mostra como o SettingsService do aplicativo multiplataforma eShop implementa as propriedades AuthTokenAccess 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. Essa implementação de serviço pode ser fornecida por meio da injeção de dependência em nosso aplicativo para uso em modelos de exibição ou outros serviços em todo o aplicativo.

Associaçã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 definir em tempo de execução. Essas configurações incluem permitir a configuração sobre 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 tiver optado por recuperar dados de microsserviços em contêineres.

Configurações do usuário expostas pelo aplicativo multiplataforma eShop.

A associação de dados pode ser usada para recuperar e definir as configurações expostas pela interface ISettingService. Isso é obtido por controles na associação de exibição para exibir propriedades de modelo que, por sua vez, acessam propriedades na interface ISettingService 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 controle Entry do SettingsView que permite que o usuário insira uma URL de ponto de extremidade de identidade base para os microsserviços em contêiner:

<Entry Text="{Binding IdentityEndpoint, Mode=TwoWay}" />

Esse controle Entry se associa à propriedade IdentityEndpoint da classe SettingsViewModel, usando uma vinculação bidirecional. O exemplo de código a seguir mostra a propriedade IdentityEndpoint:

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 propriedade IdentityEndpoint é definida, o método UpdateIdentityEndpoint é chamado, desde que o valor fornecido seja válido. O seguinte exemplo de código mostra o método UpdateIdentityEndpoint:

private void UpdateIdentityEndpoint()
{
    _settingsService.IdentityEndpointBase = _identityEndpoint;
}

Esse método atualiza a propriedade IdentityEndpointBase na implementação da interface ISettingService com o valor de URL do ponto de extremidade base inserido pelo usuário. Se a classe SettingsService for fornecida como a implementação para _settingsService, o valor persistirá no armazenamento específico da plataforma.

Resumo

As configurações permitem a separação de dados que configura o comportamento de um aplicativo do código, permitindo que o comportamento seja alterado sem recompilar o aplicativo. As configurações de 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 classe Microsoft.Maui.Storage.Preferences fornece uma abordagem consistente, fortemente tipada e multiplataforma para persistir e recuperar configurações de aplicativo e usuário.