Compartilhar via


Gerenciamento de configuração

Observação

Este eBook 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 de 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ó 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 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 propriedade e todos os Application.Current.Properties dados colocados nele são salvos quando o aplicativo entra em um estado de suspensão e é restaurado quando o aplicativo é retomado ou iniciado novamente. Além disso, a Application classe também tem 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 eles não são facilmente associados a dados. Portanto, o aplicativo móvel eShopOnContainers usa a biblioteca Xam.Plugins.Settings, disponível no NuGet. Essa biblioteca fornece uma abordagem consistente, 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.

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 os dois.

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 de aplicativo e usuário exigidas pelo aplicativo. O exemplo de código a seguir mostra a classe Configurações 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 para uma configuração de usuário que representa a URL base para o serviços online ao qual 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 somente leitura estático 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 estática usa dois métodos da ISettings API para ler ou gravar o valor de 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 para o armazenamento específico da plataforma.

Em vez disso, que define 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);  
    }  
}

Sempre 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 representa diferentes pontos de extremidade aos quais o aplicativo móvel eShopOnContainers se conecta.

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

No aplicativo móvel eShopOnContainers, o SettingsView expõe duas configurações de usuário. Essas configurações permitem 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 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 o SettingsView quando o usuário optou por recuperar dados de microsserviços conteinerizados.

Configurações de 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 as configurações expostas pela Settings classe . Isso é obtido por controles na associação de exibição para exibir propriedades de modelo que, por sua vez, acessam propriedades na Settings classe e geram uma notificação alterada 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 SettingsView que permite que o usuário insira uma URL de ponto de extremidade base para os microsserviços conteinerizados:

<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 Ponto de Extremidade:

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 propriedade alterada 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 propriedade na Settings classe com o valor de 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 para, o InitializeAsync método na SettingsViewModel 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 InitializeAsync método é invocado, consulte Passando parâmetros durante a navegação.

Esse mecanismo garante que sempre que um usuário navega até 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 mantidos 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 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 ajustes frequentes.

A biblioteca Xam.Plugins.Settings fornece uma abordagem consistente, tipada 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.