boas práticas de programação com ado.net vasco nunes safira consultadoria
TRANSCRIPT
![Page 1: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/1.jpg)
Boas Práticas de Programação com ADO.NET
Vasco NunesVasco NunesSafira ConsultadoriaSafira Consultadoriahttp://www.safira.pthttp://www.safira.pt
![Page 2: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/2.jpg)
Tópicos Como aceder de forma segura a dados
usando ADO.NET Como gerir excepções em ADO.NET Como implementar transacções Como desenvolver aplicações ADO.NET de
alta performance Técnicas de gestão de dados em ADO.NET Orientações no uso de Databound Controls Novas funcionalidades do ADO.NET 1.1
![Page 3: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/3.jpg)
Pré-requisitosConhecimentos de Arquitectura do .NETConhecimentos de VB.NET ou C#Conhecimentos de conceitos de SGBDRConhecimentos de ADO e ADO.NET
![Page 4: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/4.jpg)
Outra vez o ADO.NET?Já sabemos construir aplicações em
ADO & ADO.NET e queremos construir aplicações de alta performance
Queremos saber os principais benefícios das aplicações feitas com ADO.NET
Queremos usar o ADO.NET de uma forma optimizada
![Page 5: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/5.jpg)
Demonstrações
Segurança em ADO.NET Tratamento de erros Tratamento de transacções Boas práticas de performance Paginação de dados Boas práticas de data-binding
![Page 6: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/6.jpg)
Agenda Recomendações de Segurança na
utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound
Controls ADO.NET 1.1: Novas funcionalidades
![Page 7: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/7.jpg)
Autenticação Windows® vs. Autenticação SQL Segurança é gerida mais facilmente Usernames e passwords não são
necessários nas connection strings Maior segurança no login
Gestão de Passwords: períodos de expiração, comprimentos mínimos, bloqueio de contas depois de múltiplos logins inválidos
Passwords não são enviadas “em claro” pela rede
ADO.NET: Recomendações de Segurança Modos de Autenticação
![Page 8: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/8.jpg)
ADO.NET: Recomendações de Segurança Modos de Autenticação
Evitar personificação na Camada de Negócio para tornar o pooling de ligações mais eficiente
Criação de ligação pooled demora mais com autenticação Windows do que autenticação SQL; na execução de comandos, a diferença é insignificante
![Page 9: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/9.jpg)
Connection string pode ser guardada em: Ficheiros XML de configuração Ficheiros UDL para provider OLEDB COM+ Catalog (para serviced components) Windows Registry ...
Usando autenticação Windows Autenticação Windows não necessita que a password seja guardada
ADO.NET: Recomendações de Segurança Connection String: Opções
![Page 10: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/10.jpg)
Cifrar connection string no ficheiro XML
Restringir acesso a connection string guardada no Registry usando ACLs e/ou cifrando os dados
Alterar Persist Security info para false na connection string
Evita o retorno da password através da propriedade ConnectionString das classes SqlConnection ou OleDbConnection
ADO.NET: Recomendações de Segurança Connection String: Opções
![Page 11: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/11.jpg)
Demonstração 1Segurança em ADO.NET
Protecção contra Ataques de injecção de código SQL
Autenticação Windows e SQL
![Page 12: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/12.jpg)
Agenda Recomendações de Segurança na
utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound
Controls ADO.NET 1.1: Novas funcionalidades
![Page 13: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/13.jpg)
Tratamento de erros: Boas práticas Tratamento de Excepções
No ADO.NET os erros são propagados através de Excepções disponibilizadas a partir das classes SqlException ou OleDbException
Estender classes base para fazer o throw de erros com mais significado para código específico de acesso a dados
Usar Excepções para verificar o estado de uma ligação é ineficiente Usar ConnectionState.Open ou ConnectionState.Close
![Page 14: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/14.jpg)
Erros gerados em stored procedures usando o statement RAISEERROR São propagados para o ADO.NET como excepções
Excepções geradas se severidade > 10 Ligação é fechada se severidade > 16
Tratamento de erros: Boas práticas Erros em Stored Procedures
![Page 15: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/15.jpg)
Tratamento de erros: Boas práticas Erros em Stored Procedures
Para mensagens informativas (severidade <=10), não é gerada excepção
Mensagens informativas podem ser capturadas no ADO.NET criando um handler para o evento infoMessage da connectionAddHandler conn.infoMessage, New
SqlClient.SqlinfoMessageEventHandler(Addressof MessageEventHandler)
Sub MessageEventHandler(ByVal sender As Object, ByVal e As SqlClient.SqlinfoMessageEventArgs)
‘do whatever
![Page 16: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/16.jpg)
Demonstração 2Tratamento de erros em
ADO.NET
Tratamento de excepções e propagação de erros de Stored Procedures
![Page 17: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/17.jpg)
Agenda Recomendações de Segurança na
utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound
Controls ADO.NET 1.1: Novas funcionalidades
![Page 18: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/18.jpg)
Semântica de TransacçõesTransacções Manuais
Permitem um controlo mais efectivo da semântica transaccional
Aplicação é responsável pela transaction recovery, concorrência, segurança, ...
Transacções manuais não são suportadas no Distributed Transaction Coordinator (DTC)
![Page 19: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/19.jpg)
Semântica de TransacçõesTransacções Manuais
SqlConnection.BeginTransaction inicia uma transacção e retorna o objecto SqlTransaction associado
Associar ao objecto da transacção todos os comandos que queremos executar no contexto dessa transacção
A classe SqlTransaction tem métodos para fazer commit e rollback de transacções
![Page 20: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/20.jpg)
Semântica de TransacçõesTransacções Automáticas
Usar serviços COM+ para transacções automáticas Criar uma classe que herde de ServicedComponent
para obter um componente COM+ Acrescentar o atributo [Transaction] à classe para
controlar o comportamento transaccional
![Page 21: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/21.jpg)
Semântica de Transacções Transacções Automáticas
O atributo [AutoComplete] determina “auto-magicamente” se uma transacção deve efectuar commit ou abort Se a execução do método termina sem erros, a transacção é
committed. Caso contrário a transacção é abortada Registar o componente no COM+ para ter transacções
automáticas Assinar o componente com “strong name”
![Page 22: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/22.jpg)
Semântica de Transacções Níveis de isolamento
Controla a visibilidade das alterações efectuadas numa transacção Componentes COM+ 1.0 têm, por defeito, o nível de isolamento
Serializable Maior nível de isolamento, dados da transacção não são visíveis
para outras transacções até ao commit da transacção COM+ 1.5 (Windows.NET Server) permite configurar o isolation
level
![Page 23: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/23.jpg)
Demonstração 3Manipulação de
TransacçõesTransacções Manuais
![Page 24: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/24.jpg)
Agenda Recomendações de Segurança na
utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound
Controls ADO.NET 1.1: Novas funcionalidades
![Page 25: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/25.jpg)
Boas práticas de PerformanceConfiguração da Pool de Ligações
O managed provider de SQL efectua automaticamente a pool de ligações baseado nas connection strings
As connection strings têm de corresponder exactamente para estarem na mesma pool
![Page 26: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/26.jpg)
Pool de ligações para provider de SQL pode ser configurada na connection string
Especificar os seguintes parâmetros & valores na connection string Max Pool Size Min Pool Size
Não esquecer de fechar a ligação para a fazer retornar à pool
Boas práticas de PerformanceConfiguração da Pool de Ligações
![Page 27: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/27.jpg)
Boas práticas de PerformanceTécnicas de recolha de dados
ADO.NET disponibiliza múltiplas técnicas de recolha de dados quando uma query é executada
É importante ter noção dos resultados que a query devolve para se escolher a técnica de recolha de dados mais apropriada
![Page 28: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/28.jpg)
Boas práticas de PerformanceOpções de execução de queries
Opções de execução: ExecuteScalar – retorna o valor da primeira linha e
primeira coluna do result set. Útil para queries de contagens, somas, máximos, mínimos,...
ExecuteNonQuery – retorna o número de linhas afectadas pela execução da query. Usado com queries de insert, update, delete ou queries DDL, que não retornam resultados
ExecuteReader – retorna uma stream de resultados: “forward-only” e rápido
DataAdapter.Fill – preenche o DataSet com os resultados da query
![Page 29: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/29.jpg)
Boas práticas de PerformanceManipulação de Blobs
ADO.NET suporta recolha e armazenamento de binários de/para o Data Provider
Dados binários podem ser guardados num byte array
![Page 30: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/30.jpg)
Boas práticas de Performance Manipulação de DataSets
DataSets podem armazenar uma cópia local de resultados de queries num formato hierárquico
Aplicações clientes podem tratar um DataSet como um SGBDR local
DataSets são especialmente úteis para aplicações client-side com frequentes lookups a dados
![Page 31: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/31.jpg)
Boas práticas de Performance Dataset Vs. Datareader
DataSets são mais pesados que DataReader para operações de leitura simples e “forward-only”
DataSets são mais funcionais que DataReaders DataSets podem ser usados para armazenar
resultados de uma query e funcionar como cache
Rich clients podem usar DataSets para evitar round trips à base de dados e usar DataReaders para leituras “forward-only”
![Page 32: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/32.jpg)
Demonstração 4Boas práticas de
PerformancePooling de Ligações
Alternativas de recolha de dados Manipulação de Datasets
Manipulação de BLOBs
![Page 33: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/33.jpg)
Agenda Recomendações de Segurança na
utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound
Controls ADO.NET 1.1: Novas funcionalidades
![Page 34: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/34.jpg)
Paginação de dados em ADO.NET Paginação de dados User Interface paginado é melhor para grande volume de dados Ganhos com o acesso paginado a dados:
Menos largura de banda na rede Maior velocidade em cada execução Menor ocupação de memória na Base de Dados Menor ocupação de memória na camada de negócio Melhor performance para queries sobre tabelas ordenadas e indexadas em
colunas unique
![Page 35: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/35.jpg)
Paginação de dados em ADO.NET Paginação de dados Custos com o acesso paginado a dados:
Necessita de uma query mais elaborada
Mais esforço na Base de Dados
Mais roundtrips entre cliente e a BD aumentando a carga em termos de queries
Concatenação de colunas é necessária para tabelas sem uma coluna unique
![Page 36: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/36.jpg)
Paginação de dados em ADO.NETPaginação de dados Stored procedure com coluna unique
CREATE PROCEDURE GetProductsPaged @lastProductID int,
@pageSize int
AS
SET ROWCOUNT @pageSize
SELECT * FROM Products
WHERE [standard search criteria] AND ProductID > @lastProductID
ORDER BY [Criteria that leaves ProductID monotonically increasing]
![Page 37: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/37.jpg)
Demonstração 5Paginação de Dados
Utilização de Paginação de Dados
![Page 38: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/38.jpg)
Agenda Recomendações de Segurança na
utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound
Controls ADO.NET 1.1: Novas funcionalidades
![Page 39: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/39.jpg)
Boas práticas usando Databound Controls Comparação entre Databound Controls Usar DataReaders para ASP.NET aceder a
dados Usar DataSets quando queremos fazer cache de
dados ou com web services DataGrid binding é mais lento do que usar o
controlo DataRepeater (early-bound)
![Page 40: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/40.jpg)
Boas práticas usando Databound Controls Optimização de Databinding
Não esquecer que as ligações devem ser fechadas (mesmo no mundo do GC)
Analisar e optimizar índices das tabelas da base de dados
Reduzir os dados recolhidos da base de dados ao estritamente necessário
Usar ExecuteScalar e queries com os parametros unicamente necessários para maximizar a performance e reduzir o tráfego da rede
![Page 41: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/41.jpg)
Boas práticas usando Databound Controls Optimização de Databinding Usar o early bound DataRepeater para recolher
dados de uma forma “forward-only” e rápida Armazenar dados de acesso frequente numa
cache/DataSet para evitar round trips com a base de dados
![Page 42: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/42.jpg)
Demonstração 6Boas práticas de Data
BindingUtilização do Controlo Datagrid
Utilização do Controlo Datarepeater
![Page 43: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/43.jpg)
Agenda Recomendações de Segurança na
utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound
Controls ADO.NET 1.1: Novas funcionalidades
![Page 44: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/44.jpg)
ADO.NET 1.1: Novas funcionalidadesNovos providers
ADO.NET 1.1 inclui: SqlClient OleDb OracleClient novo Odbc novo
Não é necessário instalá-los separadamente Framework .NET 1.1 inclui ADO.NET 1.1
![Page 45: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/45.jpg)
ADO.NET 1.1: Novas funcionalidadesSQLClient e Partial Trust
Cenário Uma aplicação vai ser executada em sand-boxes
partially-trusted Internet Explorer A partir de um share \\server\share\app.exe A partir de um URL http://server.com/app.exe …
Solução SqlClient (ADO.NET 1.1) Conceder permissões explicitamente
Microsoft .NET Framework 1.1 Configuration
![Page 46: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/46.jpg)
ADO.NET 1.1: Novas funcionalidadesHasRows
Cenário Foi executado um SELECT Este pode ou não conter rows No ADO.NET 1.0, não é possível descobrir
isso sem iniciar a leitura Result-sets vazios podem dar problemas
com data-binding Solução
Usar propriedade SqlDataReader.HasRows
![Page 47: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/47.jpg)
Sumário da sessão Nesta sessão abordámos:
Recomendações de Segurança na utilização de ADO.NET no acesso a dados Recomendações no Tratamento de Erros Semântica de Transacções em ADO.NET Boas práticas de Performance Paginação de dados em ADO.NET Boas práticas usando Databound Controls ADO.NET 1.1: Novas funcionalidades
![Page 48: Boas Práticas de Programação com ADO.NET Vasco Nunes Safira Consultadoria](https://reader036.vdocuments.pub/reader036/viewer/2022062418/552fc0fa497959413d8b8f08/html5/thumbnails/48.jpg)
A importância da Formação EspecializadaSafira lança curso em parceria com a DevelopMentor
Guerrilla Web Services.NET Objectivo: dotar os participantes da capacidade
de compreensão da tecnologia e da aplicação das melhores práticas, de forma eficaz e inovadora no seu ambiente de trabalho, no desenvolvimento de Web Services
Formadores de elevado prestígio, exclusivos da DevelopMentor: Aaron Skonnard Scott Boom Simon Horrel