Compartilhar via


Gerenciamento de configuração

Observação

Este e-book foi publicado na primavera de 2017 e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado.

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 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 fixos, chaves de API e estado de runtime. As configurações do aplicativo estão vinculadas à existência do aplicativo e são significativas apenas 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 reajustes frequentes. Por exemplo, um aplicativo pode permitir que o usuário especifique de onde recuperar dados e como exibi-los na tela.

Xamarin.Forms Inclui um dicionário persistente que pode ser usado para armazenar dados de configurações. Esse dicionário pode ser acessado usando a Application.Current.Properties propriedade, e todos os dados colocados nele são salvos quando o aplicativo entra em um estado de suspensão e são restaurados quando o aplicativo é retomado ou iniciado novamente. Além disso, a Application classe também possui um SavePropertiesAsync método que permite que um aplicativo tenha suas configurações salvas quando necessário. Para obter mais informações sobre esse dicionário, consulte Dicionário de propriedades.

Uma desvantagem de armazenar dados usando o Xamarin.Forms dicionário persistente é que ele não é facilmente vinculado a dados. Portanto, o aplicativo móvel eShopOnContainers usa a biblioteca Xam.Plugins.Settings, disponível no NuGet. Essa biblioteca fornece uma abordagem consistente, segura para tipos e multiplataforma para persistir e recuperar configurações de aplicativo e usuário, enquanto 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.

Observação

Embora a biblioteca Xam.Plugin.Settings possa armazenar as configurações do aplicativo e do usuário, ela não faz distinção entre as duas.

Criando uma classe de configurações

Ao usar a biblioteca Xam.Plugins.Settings, uma única classe estática deve ser criada que conterá as configurações do aplicativo e do usuário exigidas pelo aplicativo. O exemplo de código a seguir mostra a classe Settings no aplicativo móvel eShopOnContainers:

public static class Settings  
{  
    private static ISettings AppSettings  
    {  
        get  
        {  
            return CrossSettings.Current;  
        }  
    }  
    ...  
}

As configurações podem ser lidas e gravadas por meio da ISettings API, que é fornecida pela biblioteca Xam.Plugins.Settings. Essa biblioteca fornece um singleton que pode ser usado para acessar a API, CrossSettings.Currente a classe de configurações de um aplicativo deve expor esse singleton por meio de uma ISettings propriedade.

Observação

O uso de diretivas para os namespaces Plugin.Settings e Plugin.Settings.Abstractions deve ser adicionado a uma classe que requer acesso aos tipos de biblioteca Xam.Plugins.Settings .

Adicionando uma configuração

Cada configuração consiste em uma chave, um valor padrão e uma propriedade. O exemplo de código a seguir mostra todos os três itens de uma configuração de usuário que representa a URL base para os serviços online aos quais o aplicativo móvel eShopOnContainers se conecta:

public static class Settings  
{  
    ...  
    private const string IdUrlBase = "url_base";  
    private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint;  
    ...  

    public static string UrlBase  
    {  
        get  
        {  
            return AppSettings.GetValueOrDefault<string>(IdUrlBase, UrlBaseDefault);  
        }  
        set  
        {  
            AppSettings.AddOrUpdateValue<string>(IdUrlBase, value);  
        }  
    }  
}

A chave é sempre uma cadeia de caracteres const que define o nome da chave, com o valor padrão para a configuração sendo um valor estático somente leitura 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.

A UrlBase propriedade static usa dois métodos da ISettings API para ler ou gravar o valor da configuração. O ISettings.GetValueOrDefault método é usado para recuperar o valor de uma configuração do armazenamento específico da plataforma. Se nenhum valor for definido para a configuração, seu valor padrão será recuperado. Da mesma forma, o ISettings.AddOrUpdateValue método é usado para persistir o valor de uma configuração no armazenamento específico da plataforma.

Em vez de definir um valor padrão dentro da Settings classe, a UrlBaseDefault cadeia de caracteres obtém seu valor da GlobalSetting classe. O exemplo de código a seguir mostra a propriedade e UpdateEndpoint o BaseEndpoint método nesta classe:

public class GlobalSetting  
{  
    ...  
    public string BaseEndpoint  
    {  
        get { return _baseEndpoint; }  
        set  
        {  
            _baseEndpoint = value;  
            UpdateEndpoint(_baseEndpoint);  
        }  
    }  
    ...  

    private void UpdateEndpoint(string baseEndpoint)  
    {  
        RegisterWebsite = string.Format("{0}:5105/Account/Register", baseEndpoint);  
        CatalogEndpoint = string.Format("{0}:5101", baseEndpoint);  
        OrdersEndpoint = string.Format("{0}:5102", baseEndpoint);  
        BasketEndpoint = string.Format("{0}:5103", baseEndpoint);  
        IdentityEndpoint = string.Format("{0}:5105/connect/authorize", baseEndpoint);  
        UserInfoEndpoint = string.Format("{0}:5105/connect/userinfo", baseEndpoint);  
        TokenEndpoint = string.Format("{0}:5105/connect/token", baseEndpoint);  
        LogoutEndpoint = string.Format("{0}:5105/connect/endsession", baseEndpoint);  
        IdentityCallback = string.Format("{0}:5105/xamarincallback", baseEndpoint);  
        LogoutCallback = string.Format("{0}:5105/Account/Redirecting", baseEndpoint);  
    }  
}

Cada vez que a BaseEndpoint propriedade é definida, o UpdateEndpoint método é chamado. Esse método atualiza uma série de propriedades, todas baseadas na UrlBase configuração do usuário fornecida pela Settings classe que representam diferentes pontos de extremidade aos quais o aplicativo móvel eShopOnContainers se conecta.

Vinculação de dados às configurações do usuário

No aplicativo móvel eShopOnContainers, o SettingsView expõe duas configurações do usuário. Essas configurações permitem a configuração 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 optar por recuperar dados de microsserviços em contêineres, uma URL de ponto de extremidade base para os microsserviços deve ser especificada. A Figura 7-1 mostra quando SettingsView o usuário optou por recuperar dados de microsserviços em contêineres.

Configurações do usuário expostas pelo aplicativo móvel eShopOnContainers

Figura 7-1: Configurações do usuário expostas pelo aplicativo móvel eShopOnContainers

A associação de dados pode ser usada para recuperar e definir configurações expostas pela Settings classe. Isso é obtido por controles na associação de exibição para exibir propriedades do modelo que, por sua vez, acessam propriedades na Settings classe e geram uma notificação de alteração de propriedade se o valor das configurações tiver sido alterado. Para obter informações sobre como o aplicativo móvel eShopOnContainers constrói modelos de exibição e os associa a exibições, consulte Criando automaticamente um modelo de exibição com um localizador de modelo de exibição.

O exemplo de código a seguir mostra o Entry controle do que permite ao usuário inserir uma URL de SettingsView ponto de extremidade base para os microsserviços em contêineres:

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

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

public string Endpoint  
{  
    get { return _endpoint; }  
    set  
    {  
        _endpoint = value;  

        if(!string.IsNullOrEmpty(_endpoint))  
        {  
            UpdateEndpoint(_endpoint);  
        }  

        RaisePropertyChanged(() => Endpoint);  
    }  
}

Quando a Endpoint propriedade é definida, o UpdateEndpoint método é chamado, desde que o valor fornecido seja válido e a notificação de alteração de propriedade seja gerada. O seguinte exemplo de código mostra o método UpdateEndpoint:

private void UpdateEndpoint(string endpoint)  
{  
    Settings.UrlBase = endpoint;  
}

Esse método atualiza a UrlBase Settings propriedade na classe com o valor da URL do ponto de extremidade base inserido pelo usuário, o que faz com que ela seja mantida no armazenamento específico da plataforma.

Quando o SettingsView é navegado, o InitializeAsync SettingsViewModel método na classe é executado. O seguinte exemplo de código mostra esse método:

public override Task InitializeAsync(object navigationData)  
{  
    ...  
    Endpoint = Settings.UrlBase;  
    ...  
}

O método define a Endpoint propriedade como o valor da UrlBase propriedade na Settings classe. Acessar a UrlBase propriedade faz com que a biblioteca Xam.Plugins.Settings recupere o valor de configurações do armazenamento específico da plataforma. Para obter informações sobre como o método é invocado, consulte Passando parâmetros durante a InitializeAsync navegação.

Esse mecanismo garante que, sempre que um usuário navegar para o SettingsView, as configurações do usuário sejam recuperadas do armazenamento específico da plataforma e apresentadas por meio da associação de dados. Em seguida, se o usuário alterar os valores de configurações, a associação de dados garantirá que eles sejam imediatamente persistidos de volta ao 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 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 biblioteca Xam.Plugins.Settings fornece uma abordagem consistente, segura para tipos e multiplataforma para persistir e recuperar configurações de aplicativo e usuário, e a associação de dados pode ser usada para acessar as configurações criadas com a biblioteca.