Como usar o Cloud Datastore com o .NET

Nesta parte do tutorial do Bookshelf em .NET, mostramos como criar, ler, atualizar e excluir dados estruturados no Cloud Datastore.

Esta página é parte de um tutorial com várias páginas. Para ver do início e ler as instruções de configuração, consulte o artigo App Bookshelf em .NET.

Como definir configurações

  1. No diretório getting-started-dotnet\aspnet\2-structured-data, clique duas vezes em 2-structured-data.sln para abrir o app de amostra no Visual Studio.

  2. No painel Gerenciador de Soluções, clique em Web.config.

  3. Em Web.config, conclua as etapas a seguir:

    1. Defina GoogleCloudSamples:ProjectId como código do projeto.

    2. Defina GoogleCloudSamples:BookStore como datastore.

  4. Salve e feche Web.config.

Execução do app na máquina local

No Visual Studio, pressione F5 para executar o projeto. Agora, navegue nas páginas da Web do aplicativo para adicionar, editar e excluir livros.

Como implantar o app no Compute Engine

  1. No painel Gerenciador de Soluções do Visual Studio, clique com o botão direito do mouse em 2-structured-data e clique em Publicar.

    Publicar app

  2. Na caixa de diálogo Publicar Web, selecione Personalizado como destino de publicação.

  3. Na caixa de diálogo Novo perfil personalizado, digite bookshelf-profile para o Nome de perfil. Clique em OK.

  4. Preencha o perfil:

    1. Em Servidor, digite o endereço IP externo da instância do Compute Engine.

    2. Em Nome do site, digite Default Web Site.

    3. Em Nome de usuário, digite o nome de usuário da conta de usuário do Windows que você criou na sua instância do Compute Engine.

    4. Em Senha, digite a senha da conta de usuário do Windows que você criou na sua instância do Compute Engine.

    5. Em URL de destino, digite http://[EXTERNAL_IP_ADDRESS_OF_YOUR_COMPUTE_ENGINE_INSTANCE].

      Onde:

      • [EXTERNAL_IP_ADDRESS_OF_YOUR_COMPUTE_ENGINE_INSTANCE] representa o endereço IP externo da instância do Compute Engine.
  5. Para verificar suas credenciais e configurações de perfil, clique em Validar conexão.

  6. Como a instalação do Microsoft IIS na sua implantação usa um certificado autoassinado por padrão, você verá um Erro de certificado durante o processo de validação. Marque a caixa Salvar este certificado para sessões futuras do Visual Studio e clique em Aceitar para aceitar o certificado.

  7. Clique em Configurações.

  8. Clique em Opções de publicação de arquivo e selecione Remova arquivos adicionais no destino. Isso é importante para as etapas posteriores, quando você publicar novos sites na mesma instância do Compute Engine.

  9. Clique em Publicar para implantar o exemplo de aplicativo da Web. Depois que a publicação for concluída, o Visual Studio abrirá o aplicativo no navegador da Web padrão.

Estrutura do app

Este diagrama mostra os componentes do app e como se encaixam. Ele segue o padrão ASP.NET MVC clássico. Há uma interface IBookStore entre BooksController e DatastoreBookStore para que você possa começar a armazenar seus dados de livros no Cloud SQL sem alterar qualquer código.

Estrutura do aplicativo Bookshelf

Noções básicas sobre o código

Esta seção analisa o código do aplicativo e explica como ele funciona.

O modelo de dados

A classe Book mantém informações sobre um livro, além de campos adicionais que serão usados em tutoriais posteriores.

    [Bind(Include = "Title, Author, PublishedDate, Description")]
    public class Book
    {
        [Key]
        public long Id { get; set; }

        [Required]
        public string Title { get; set; }

        public string Author { get; set; }

        [Display(Name = "Date Published")]
        [DataType(DataType.Date)]
        public DateTime? PublishedDate { get; set; }

        public string ImageUrl { get; set; }

        [DataType(DataType.MultilineText)]
        public string Description { get; set; }

        public string CreatedById { get; set; }
    }

Processamento de envios do usuário com formulários

O formulário HTML para adicionar/editar permite que os usuários adicionem e editem envios de livros no app.

Imagem do formulário para adicionar/editar

O formulário HTML é criado usando modelos Razor. Esse tipo de modelo especifica se o formulário incluirá campos de texto de entrada para título, autor, data de publicação e descrição.

<form action="/Books/@Model.FormAction/@Model.Book.Id" method="post" id="book-form" enctype="multipart/form-data">
    @Html.AntiForgeryToken()
    <div class="form-group">
        @Html.LabelFor(model => model.Book.Title)
        @Html.EditorFor(model => model.Book.Title, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Book.Title, "", new { @class = "text-danger" })
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Book.Author)
        @Html.EditorFor(model => model.Book.Author, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Book.Author, "", new { @class = "text-danger" })
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Book.PublishedDate)
        @Html.EditorFor(model => model.Book.PublishedDate, new { htmlAttributes = new { @class = "form-control", @type = "text" } })
        @Html.ValidationMessageFor(model => model.Book.PublishedDate, "", new { @class = "text-danger" })
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Book.Description)
        @Html.EditorFor(model => model.Book.Description, new { htmlAttributes = new { @class = "form-control", @type = "text" } })
        @Html.ValidationMessageFor(model => model.Book.Description, "", new { @class = "text-danger" })
    </div>

    <button type="submit" class="btn btn-success">Save</button>
</form>

Como processar envios do formulário

Quando você clica em Adicionar livro, o método BooksController.Create() exibe o formulário. Depois de preenchê-lo e clicar em Salvar, o método BooksController.Create() recebe o conteúdo do formulário e o envia para o banco de dados do Cloud SQL pelo método IBookStore::Create(). Observe que o método Create é anotado com HttpPost.

        // GET: Books/Create
        public ActionResult Create()
        {
            return ViewForm("Create", "Create");
        }

        // POST: Books/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Book book)
        {
            if (ModelState.IsValid)
            {
                _store.Create(book);
                return RedirectToAction("Details", new { id = book.Id });
            }
            return ViewForm("Create", "Create", book);
        }

A classe DatastoreBookStore chama a API Cloud Datastore para executar consultas e realizar operações Create, Read, Update e Delete (CRUD, na sigla em inglês).

Aqui está o método Create:

public void Create(Book book)
{
    var entity = book.ToEntity();
    entity.Key = _db.CreateKeyFactory("Book").CreateIncompleteKey();
    var keys = _db.Insert(new[] { entity });
    book.Id = keys.First().Path.First().Id;
}

Primeiro, Create chamadas CreateIncompleteKey que informam ao Cloud Datastore para criar uma chave para a nova entidade. Em seguida, ele chama Insert para inserir o novo livro no Cloud Datastore. Por fim, ele atualiza o código do livro com a nova chave criada pelo Cloud Datastore. Os códigos não são criados em ordem sequencial.

A classe DatastoreBookStoreExtensionMethods tem métodos auxiliares para facilitar a compactação de um Book no Cloud Datastore. O método auxiliar ToEntity converte um Book em uma entidade do Cloud Datastore.

public static Entity ToEntity(this Book book) => new Entity()
{
    Key = book.Id.ToKey(),
    ["Title"] = book.Title,
    ["Author"] = book.Author,
    ["PublishedDate"] = book.PublishedDate?.ToUniversalTime(),
    ["ImageUrl"] = book.ImageUrl,
    ["Description"] = book.Description,
    ["CreateById"] = book.CreatedById
};

Veja todos os métodos auxiliares disponíveis no GitHub.

Como listar livros

Depois que os livros são adicionados, clique no link Livros para acessar a página /Books, que lista todos os livros armazenados no Cloud Datastore. O método List lista todos os livros usando dados recuperados do Cloud Datastore.

public BookList List(int pageSize, string nextPageToken)
{
    var query = new Query("Book") { Limit = pageSize };
    if (!string.IsNullOrWhiteSpace(nextPageToken))
        query.StartCursor = ByteString.FromBase64(nextPageToken);
    var results = _db.RunQuery(query);
    return new BookList()
    {
        Books = results.Entities.Select(entity => entity.ToBook()),
        NextPageToken = results.Entities.Count == query.Limit ?
            results.EndCursor.ToBase64() : null
    };
}

O método List cria e executa uma Query para encontrar todas as entidades do tipo Book. Ele usa os cursores de consulta do Cloud Datastore para implementar a paginação.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…