Prévia do material em texto
Prof. MSc. Tarcísio Peres
UNIDADE III
Programação Orientada
a Objetos II
Desenvolvimento em camadas e MVC.
Entendendo os componentes do Windows Presentation Foundation.
MVVM e sua integração com XAML.
String de conexão: utilização do SQLClient.
Conexões locais e servidores remotos no contexto da computação em nuvem.
LINQ e ADO.NET
Conteúdo da unidade III
No desenvolvimento de software, a arquitetura em camadas e o modelo MVC (Model-View-
Controller) são abordagens que ajudam a organizar e estruturar aplicações de maneira
eficiente e sustentável.
Na arquitetura em camadas, a aplicação é dividida em diferentes níveis, cada um
responsável por um aspecto específico do processo.
Geralmente, essas camadas incluem a interface do usuário, a lógica de negócios e o
acesso a dados.
A camada da interface do usuário é a frente (front end) da aplicação, interagindo diretamente
com o usuário e apresentando dados de forma compreensível.
A lógica de negócios, por sua vez, lida com o processamento
de informações, regras de negócio e decisões.
A camada de acesso a dados é responsável pela comunicação
com os sistemas de armazenamento, como bancos de dados,
garantindo que os dados sejam guardados e recuperados de
forma eficaz.
Arquitetura em camadas
Essa separação clara permite que cada camada seja desenvolvida, testada e mantida de
forma independente, o que aumenta a eficiência e reduz a complexidade geral do sistema.
Essa estrutura oferece a flexibilidade para alterar ou atualizar uma camada específica sem
afetar as outras, facilitando a adaptação a novas tecnologias ou requisitos de negócios.
Paralelamente, o padrão MVC, especialmente popular em ambientes de desenvolvimento
como C#, oferece um framework robusto para a separação de responsabilidades.
No MVC, a aplicação é dividida em três componentes : o Modelo, a Visão e o Controlador.
O Modelo representa a lógica de dados e as regras de negócio, mantendo-se independente
da interface do usuário.
A Visão é a camada que apresenta os dados ao usuário,
sendo uma representação visual das informações contidas
no Modelo.
O Controlador atua como intermediário entre o Modelo
e a Visão, manipulando os dados do Modelo e
apresentando-os na Visão.
Arquitetura MVC
O Controlador responde às interações do usuário, como cliques ou entradas de dados, e
realiza as ações correspondentes.
O MVC é particularmente eficaz na promoção da separação de responsabilidades, facilitando
a manutenção e a expansão das aplicações.
Ao isolar a lógica de negócios e a interface do usuário, permite aos desenvolvedores alterar
a aparência da aplicação sem interferir na lógica por trás dela.
Essa separação torna também mais fácil testar diferentes
componentes de forma independente, contribuindo para a
qualidade e confiabilidade do software.
Arquitetura MVC
O padrão Model-View-ViewModel (MVVM) é uma abordagem arquitetônica no
desenvolvimento de software que enfatiza a separação clara de responsabilidades entre a
interface do usuário e a lógica de negócios, algo de extrema importância em projetos
complexos, especialmente naqueles desenvolvidos com tecnologias Microsoft, como WPF
(Windows Presentation Foundation) em C#.
Originário do desejo de facilitar a manutenção e a escalabilidade de aplicações, o MVVM
tornou-se um elemento central na arquitetura de software moderna.
No centro do MVVM está a divisão de uma aplicação em três componentes principais: o
Model, o View e o ViewModel.
O Model representa a lógica de negócios e os dados
subjacentes. É o núcleo funcional da aplicação, contendo as
regras, algoritmos e estruturas de dados que definem o
comportamento da aplicação.
Em um contexto C#, o Model seria composto por classes que
gerenciam os dados e a lógica de negócios da aplicação, muitas
vezes interagindo com bancos de dados ou serviços web.
Model-View-ViewModel
O View é a interface do usuário.
É a representação visual da aplicação, responsável por apresentar os dados ao usuário e
capturar as interações do usuário.
Em WPF e outras tecnologias baseadas em C#, o View é frequentemente construído usando
XAML (Extensible Application Markup Language), que permite a descrição declarativa da
interface do usuário.
O ViewModel atua como um intermediário entre o Model e o View.
Ele é responsável por lidar com a lógica de apresentação.
O ViewModel transforma dados do Model em formatos que
podem ser facilmente apresentados no View.
Ele implementa comandos e ações que são acionados pela
interface do usuário.
Essencialmente, o ViewModel "traduz" as informações do
Model de uma forma que o View possa entender e apresentar
de forma eficaz.
Model-View-ViewModel
Uma das vantagens mais significativas do MVVM é a facilitação de testes
unitários e manutenção.
Como o ViewModel não depende diretamente do View, é possível testar a lógica de
apresentação sem a necessidade de uma interface de usuário, o que simplifica os
testes automatizados.
Essa separação permite que designers e desenvolvedores trabalhem de maneira
mais independente e paralela, melhorando a eficiência do desenvolvimento.
Outra característica importante do MVVM em C# é a implementação do data binding.
Data binding é um conceito que permite a ligação de
elementos da interface do usuário a propriedades
no ViewModel.
Quando os dados no ViewModel mudam, a interface do
usuário é automaticamente atualizada para refletir essas
mudanças e vice-versa.
Model-View-ViewModel
Jogo em WPF.
Os três mosqueteiros
Fonte: autoria própria.
Qual das seguintes opções melhor descreve o benefício do modelo MVC em desenvolvimento
de software?
a) Permite uma complexa integração de dados em tempo real.
b) Facilita a criptografia de dados sensíveis dentro da aplicação.
c) Melhora a reusabilidade e a manutenção ao separar as responsabilidades.
d) Aumenta a velocidade de processamento da aplicação.
e) Reduz a necessidade de testes devido à automatização integrada.
Interatividade
Qual das seguintes opções melhor descreve o benefício do modelo MVC em desenvolvimento
de software?
a) Permite uma complexa integração de dados em tempo real.
b) Facilita a criptografia de dados sensíveis dentro da aplicação.
c) Melhora a reusabilidade e a manutenção ao separar as responsabilidades.
d) Aumenta a velocidade de processamento da aplicação.
e) Reduz a necessidade de testes devido à automatização integrada.
Resposta
JanelaPrincipal.xaml
WPF - Windows Presentation Foundation
Jogo em WPF.
Os três mosqueteiros
Fonte: autoria própria.
JanelaPrincipal.xaml
WPF - Windows Presentation Foundation
JanelaPrincipal.xaml
WPF - Windows Presentation Foundation
TransparentButton}"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
BorderThickness="0" Margin="0,0,50,50"
Click="RolarDado_Click"
Width="300" Height="300"
PreviewMouseDown="BotaoDado_PreviewMouseDown"
PreviewMouseUp="BotaoDado_PreviewMouseUp"
Visibility="{Binding VisibilidadeDado}">
JanelaPrincipal.xaml
WPF - Windows Presentation Foundation
JanelaPrincipal.xaml
WPF - Windows Presentation Foundation
JanelaPrincipal.xaml
WPF - Windows Presentation Foundation
JanelaPrincipal.xaml.cs
WPF - Windows Presentation Foundation
public partial class JanelaPrincipal : Window
{
private JogoViewModel jogoViewModel;
public JanelaPrincipal()
{
InitializeComponent();
jogoViewModel = new JogoViewModel();
this.DataContext = jogoViewModel; // Define o
DataContext da janela
}
private void RolarDado_Click(object sender,
RoutedEventArgs e)
{
int resultadoDado = jogoViewModel.RolarDado();
jogoViewModel.MoverJogadorAtual(resultadoDado);
}
JanelaPrincipal.xaml.cs
WPF - Windows Presentation Foundation
private void BotaoDado_PreviewMouseDown(object sender,
MouseButtonEventArgs e)
{
jogoViewModel.ImagemDado = "/DadoE.png";
}
private void BotaoDado_PreviewMouseUp(object sender,
MouseButtonEventArgs e)
{
jogoViewModel.ImagemDado = "/Dado.png";
}
private void ImagemCarta_MouseDown(object sender, MouseButtonEventArgs e)
{
jogoViewModel.ImagemCarta = "/CartaVerso.png";
jogoViewModel.VisibilidadeDado = Visibility.Visible;
}
}
}
Jogo em WPF.
Os três mosqueteiros
Fonte: autoria própria.
Qual das seguintes declarações está correta sobre o método RolarDado_Click?
a) Ele modifica diretamente a visibilidade do dado.
b) Ele atualiza a posição do jogador usando o resultado de um dado.
c) Ele redefine a imagem do dado para a imagem padrão.
d) Ele é chamado antes do evento PreviewMouseDown.
e) Ele é usado para esconder a imagem do dado.
Interatividade
Qual das seguintes declarações está correta sobre o método RolarDado_Click?
a) Ele modifica diretamente a visibilidade do dado.
b) Ele atualiza a posição do jogador usando o resultado de um dado.
c) Ele redefine a imagem do dado para a imagem padrão.
d) Ele é chamado antes do evento PreviewMouseDown.
e) Ele é usado para esconder a imagem do dado.
Resposta
As strings de conexão são essencialmente uma coleção de parâmetros utilizados para definir
a comunicação entre uma aplicação e um banco de dados.
Esses parâmetros podem incluir o nome do servidor, o nome do banco de dados, credenciais
de usuário e senha e outras configurações relevantes.
Uma string de conexão bem configurada é fundamental para garantir uma conexão segura e
eficiente com o banco de dados.
Entre os provedores de dados mais utilizados no .NET Framework para gerenciar essas
conexões, destaca-se o SQLClient, projetado especificamente para interagir com bases de
dados SQL Server.
Ele é amplamente reconhecido por sua alta performance e
integração estreita com o SQL Server, proporcionando um
meio direto e eficaz de executar comandos SQL, ler dados e
manipular transações.
Um dos principais benefícios do SQLClient é a sua alta
eficiência e desempenho.
String de conexão
Por ser uma solução dedicada ao SQL Server, é capaz de aproveitar características
específicas desse sistema de gerenciamento de banco de dados, oferecendo uma
comunicação mais rápida e eficaz em comparação com provedores de dados
mais genéricos.
Isso se traduz em tempos de resposta mais rápidos e menor consumo de recursos, aspectos
críticos para aplicações de larga escala e alta demanda
O SQLClient também se destaca por sua segurança e estabilidade.
Ele suporta uma gama de recursos de segurança do SQL Server, incluindo autenticação
integrada e encriptação de dados.
Outro aspecto importante do SQLClient é a sua forte tipagem.
O suporte a tipos de dados específicos do SQL Server reduz a
ocorrência de erros de tipo em tempo de execução e melhora
a legibilidade e manutenção do código.
String de conexão
O SQLClient também facilita a execução de procedimentos armazenados e transações,
oferecendo aos desenvolvedores um controle granular sobre o comportamento das
operações de banco de dados.
Essa capacidade é particularmente útil em cenários complexos de negócios, nos quais
operações múltiplas precisam ser executadas de forma atômica e consistente.
É utilizado por meio das classes como SqlConnection, SqlCommand e SqlDataReader.
A classe SqlConnection é usada para estabelecer a conexão com o banco de dados
SqlCommand permite a execução de consultas SQL e procedimentos armazenados.
O SqlDataReader é uma ferramenta eficiente para ler dados de forma rápida e sequencial.
String de conexão
Note os parâmetros.
Conexão manual
Fonte: autoria própria.
Criando banco.
Conexão manual
Fonte: autoria própria.
Criando colunas.
Conexão manual
Fonte: autoria própria.
String de conexão.
Conexão automática
using System;
using System.Data.SqlClient;
namespace ConsoleApp4
{
internal class Program
{
static void Main(string[] args)
{
string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial
Catalog=Jogador;Integrated Security=True";
// Inserir cada jogador
InsertJogador(connectionString, "Athos", "01", "05", "05");
InsertJogador(connectionString, "Pothos", "01", "05", "05");
InsertJogador(connectionString, "Aramis", "01", "05", "05");
InsertJogador(connectionString, "Dartagnan", "01", "05", "05");
Console.ReadLine();
}
Inserindo dados.
Conexão automática
static void InsertJogador(string connectionString, string nome, string posicao,
string fortuna, string honra)
{
string query = "INSERT INTO Jogador (Jogador, Posicao, Fortuna, Honra)
VALUES (@Jogador, @Posicao, @Fortuna, @Honra)";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Jogador", nome);
command.Parameters.AddWithValue("@Posicao", posicao);
command.Parameters.AddWithValue("@Fortuna",fortuna);
command.Parameters.AddWithValue("@Honra", honra);
connection.Open();
int result = command.ExecuteNonQuery();
if (result > 0) Console.WriteLine($"Inserção de {nome} realizada com sucesso!");
else Console.WriteLine("Inserção falhou."); }}}}
Qual ação é realizada pela linha command.Parameters.AddWithValue("@Jogador", nome);?
a) Conecta a base de dados usando o nome como chave.
b) Insere um novo registro na tabela com o nome do jogador.
c) Cria um novo parâmetro para o comando SQL para evitar SQL injection.
d) Configura o nome da tabela onde os dados serão inseridos.
e) Define o nome da fonte de dados na string de conexão.
Interatividade
Qual ação é realizada pela linha command.Parameters.AddWithValue("@Jogador", nome);?
a) Conecta a base de dados usando o nome como chave.
b) Insere um novo registro na tabela com o nome do jogador.
c) Cria um novo parâmetro para o comando SQL para evitar SQL injection.
d) Configura o nome da tabela onde os dados serão inseridos.
e) Define o nome da fonte de dados na string de conexão.
Resposta
String de conexão.
Conexão automática
using System;
using System.Data.SqlClient;
namespace ConsoleApp4
{
internal class Program
{
static void Main(string[] args)
{
string connectionString = @"Data
Source=(localdb)\MSSQLLocalDB;Initial Catalog=Jogador;Integrated
Security=True";
// Inserir cada jogador como fizemos anteriormente
// Ler todos os jogadores
ReadJogadores(connectionString);
}
Consultando dados.
Conexão automática
static void ReadJogadores(string connectionString)
{
string query = "SELECT Jogador, Posicao, Fortuna, Honra
FROM Jogador";
using (SqlConnection connection = new
SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(query,
connection);
connection.Open();
Imprimindo dados.
Conexão automática
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine($"Jogador:
{reader["Jogador"]}, Posição:
{reader["Posicao"]}, Fortuna:
{reader["Fortuna"]}, Honra:
{reader["Honra"]}");
}
Console.ReadLine();
}
}
}
}
}
Além do SQLClient, existem outros provedores de dados como OLE DB e ODBC.
OLE DB, sigla para Object Linking and Embedding Database, é um conjunto de interfaces
que permite acesso uniforme a diferentes tipos de fontes de dados.
É bastante versátil, mas pode ser um pouco mais complexo de se usar em algumas
situações.
Já o ODBC (Open Database Connectivity) é um padrão que permite a conexão com uma
ampla variedade de bancos de dados, utilizando um driver intermediário.
O ODBC pode não ser tão otimizado para determinados tipos de bancos de dados
específicos como o SQLClient é para o SQL Server.
A decisão de usar OLE DB ou ODBC em vez de SqlClient
depende de uma avaliação cuidadosa das necessidades
específicas da aplicação, incluindo o tipo de fonte de dados a
ser acessada, a necessidade de portabilidade entre diferentes
sistemas operacionais e ambientes e os requisitos de
desempenho e funcionalidade.
Outros provedores
A computação em nuvem, ao permitir o acesso a recursos computacionais avançados sob
demanda, elimina a necessidade de investimentos pesados em infraestrutura física.
Para um desenvolvedor que utiliza C# para criar soluções que interagem com bancos de
dados SQL Server, isso significa que é possível escalar recursos de maneira flexível,
pagando apenas pelo que se usa.
No entanto, essa flexibilidade traz consigo a necessidade de garantir que as conexões entre
os ambientes locais e os servidores remotos sejam seguras e eficientes.
No que diz respeito à segurança, é imprescindível que os dados transmitidos entre o cliente e
o servidor remoto sejam criptografados e protegidos contra acessos não autorizados.
Utilizar práticas recomendadas de segurança, como a
implementação de VPNs (Redes Privadas Virtuais) e o uso de
protocolos de criptografia robustos, torna-se essencial para
prevenir violações de dados.
Computação em nuvem
Além da segurança, a latência é outro fator crítico a ser considerado.
Desenvolvedores que trabalham com aplicações em tempo real sabem que o tempo de
resposta é crucial para a experiência do usuário.
Portanto, ao migrar para a nuvem, é importante escolher provedores de serviços em
nuvem que ofereçam baixa latência e garantam a rápida transmissão de dados entre o
cliente e o servidor.
A integração de sistemas locais com servidores remotos na nuvem também representa
um desafio.
É essencial que os desenvolvedores criem interfaces de
programação de aplicativos (APIs) bem projetadas e utilizem
serviços de middleware para facilitar a comunicação entre
diferentes sistemas.
Entender como utilizar adequadamente os serviços de nuvem
e como integrá-los às aplicações locais é fundamental para o
sucesso do projeto.
Computação em nuvem
Ao migrar para a nuvem, o desenvolvedor precisa se familiarizar com os serviços de
computação em nuvem oferecidos por plataformas como Azure (da Microsoft), AWS (da
Amazon) ou Google Cloud Platform (do Google).
Essas plataformas fornecem serviços de banco de dados que podem ser semelhantes ao
SQL Server, como o Azure SQL Database no caso do Azure, mas também introduzem novos
paradigmas, como bancos de dados NoSQL, funções como serviço (FaaS) e outros serviços
de computação sem servidor (serverless).
Computação em nuvem
String de conexão.
Computação em nuvem
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
// String de conexão ao Azure SQL Database
var connectionString =
"Server=tcp:seuservidor.database.windows.net,1433;Ini
tial Catalog=seuBanco;Persist Security
Info=False;User
ID=seuUsername;Password=seuPassword;MultipleActiveRes
ultSets=False;Encrypt=True;TrustServerCertificate=Fal
se;Connection Timeout=30;";
Consulta SQL.
Computação em nuvem
var sqlQuery = "SELECT TOP 10 * FROM SuaTabela";
using (var connection = new
SqlConnection(connectionString))
{
var command = new SqlCommand(sqlQuery, connection);
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["NomeDaSuaColuna"].ToString());
}
}
}
}
}
LINQ e ADO.NET representam duas tecnologias essenciais para a manipulação e o acesso a
dados, cada uma com suas particularidades e casos de uso.
O LINQ, uma extensão do .NET, introduz um método para consultas de dados, permitindo
que sejam escritas diretamente na linguagem C# de maneira declarativa.
Independentemente do tipo de dados - seja em uma coleção em memória, um arquivo XML
ou um banco de dados - o desenvolvedor pode utilizar a mesma sintaxe de consulta,
facilitando a manutenção e a reutilização do código.
ADO.NET é uma estrutura mais antiga e robusta, projetada para o acesso a dados e a
manipulação de bancos de dados relacionais.
ADO.NET oferece um conjunto de classes que permitem
conectar-se a fontes de dados, executar comandos, gerenciar
transações e lidar com o retorno de dados.
ADO.NET é particularmente útil em cenários que exigem
operações complexas, transações ou otimizações específicas
de desempenho que estão além do escopo do LINQ.
LINQ e ADO.NET
Qual recurso o SQLClient não suporta diretamente?
a) Executar comandos SQL.
b) Ler dados de forma sequencial.
c) Manipular transações.
d) Conectar-se a bancos de dados no SQL.
e) Oferecer alta performance e segurança.
Interatividade
Qual recurso o SQLClient não suporta diretamente?
a) Executar comandos SQL.
b) Ler dados de forma sequencial.
c) Manipular transações.
d) Conectar-se a bancos de dados no SQL.
e) Oferecer alta performance e segurança.
Resposta
ATÉ A PRÓXIMA!