Um Mergulho Profundo na Conexão de Texto em C#
Na Lição 11 da série "C# App Start to Finish" de Tim Corey, Tim explica como salvar dados em arquivos de texto usando uma conexão baseada em texto. Tim começa lembrando aos espectadores que, na lição anterior, eles configuraram a conexão SQL e realizaram tarefas principais de manutenção. Agora, o foco se desloca para a Conexão de Texto, e o objetivo é claro: fazer a conexão de texto funcionar exatamente como a conexão SQL, onde o sistema pode pegar um PrizeModel e retorná-lo com seu ID devidamente preenchido. Tim enfatiza que o vídeo mostrará um fluxo de trabalho completo para armazenar, ler e atualizar dados usando arquivos de texto simples.
A Solução — Configurando a Conexão de Texto
Tim começa abrindo o Conector de Texto dentro da pasta DataAccess. Ele apaga o código de exemplo e começa do zero. Ele explica que, ao contrário do SQL, arquivos de texto não oferecem recursos de banco de dados inteligentes como IDs de auto-incremento. Portanto, a primeira tarefa é decidir onde armazenar os arquivos de texto.
Tim propõe um design limpo: armazenar cada modelo em seu próprio arquivo de texto. Por exemplo, PrizeModel terá seu próprio arquivo chamado PrizeModels.csv, enquanto outros modelos, como MatchupModel, terão cada um arquivos separados. Tim compara essa estrutura às tabelas SQL — cada arquivo se torna uma "tabela" contendo uma lista daquele modelo. Isso torna os dados fáceis de gerenciar e evita misturar diferentes tipos de modelos.
A String de Conexão — Armazenando o Caminho do Arquivo
Tim explica que, em vez de armazenar um único nome de arquivo, você armazena um caminho para a pasta onde todos os arquivos serão salvos. Esse caminho é colocado no app.config sob appSettings. Tim adiciona um novo par chave-valor:
-
Chave: filePath
- Valor: o caminho da pasta onde os arquivos serão armazenados
Ele enfatiza usar a sintaxe correta do Windows e evita terminar o caminho com uma barra, pois prefere adicionar a barra apenas ao construir o caminho completo do arquivo. Essa configuração é crucial porque torna o aplicativo flexível — se a localização do armazenamento mudar, basta atualizar o app.config.
O Plano — Como Funciona a Conexão de Texto
Tim delineia um plano claro para salvar um prêmio:
-
Carregar o arquivo de texto contendo todos os prêmios.
-
Converter linhas de texto em uma lista de PrizeModel.
-
Encontrar o maior ID na lista e definir novo ID = maior ID + 1.
-
Adicionar o novo modelo de prêmio à lista.
-
Converter a lista de prêmios de volta em linhas de texto.
- Salvar a lista de volta no arquivo de texto, sobrescrevendo os dados antigos.
Tim explica que arquivos de texto são "burros" em comparação com bancos de dados SQL. O SQL pode gerenciar IDs automaticamente, mas arquivos de texto exigem que o desenvolvedor implemente lógica manualmente. É por isso que Tim divide o processo em métodos menores para manter o código limpo e reutilizável.
Criando uma Nova Classe — Text Connector Processor
Tim cria uma nova classe chamada TextConnectorProcessor. Ele a coloca dentro da pasta DataAccess, mas em um namespace diferente, para evitar sobrecarregar o namespace principal. Tim explica que namespaces são flexíveis e podem ser personalizados, mas recomenda mantê-los simples e limpos.
Ele torna a classe public static e começa a construir métodos auxiliares.
Método de Extensão — Caminho Completo do Arquivo
Tim cria um método de extensão:
public static string FullFilePath(this string fileName)
Este método combina o filePath do app.config com o nome do arquivo para gerar o caminho completo do arquivo. Tim demonstra como usar ConfigurationManager.AppSettings["filePath"] e explica a necessidade de escapar barras em strings C# (usando \).
Ele então converte o método em um método de extensão para que possa ser usado assim:
"PrizeModels.csv".FullFilePath()
Tim explica que este método de extensão é necessário apenas no conector de texto, então o mantém em um namespace separado para evitar que apareça em toda a solução.
Método de Carregar Arquivo — Lendo Dados de Texto
Em seguida, Tim cria outro método de extensão:
public static List<string> LoadFile(this string file)
Este método verifica se o arquivo existe usando File.Exists(). Se o arquivo não existir, ele retorna uma lista vazia. Se existir, lê todas as linhas usando File.ReadAllLines() e as converte em uma lista.
Tim destaca a importância de lidar adequadamente com arquivos ausentes, já que isso é comum na primeira execução do aplicativo.
Convertendo Texto para Modelos de Prêmios
Tim cria um método para converter as linhas de texto carregadas em uma lista de PrizeModel:
public static List<PrizeModel> ConvertToPrizeModels(this List<string> lines)
Ele explica o uso de valores separados por vírgula (CSV), onde cada linha contém campos separados por vírgulas. Tim divide cada linha em colunas e as analisa nos tipos de dados apropriados:
-
ID → int.Parse()
-
PlaceNumber → int.Parse()
-
PlaceName → string
-
PrizeAmount → decimal.Parse()
- PrizePercentage → double.Parse()
Tim também explica que permite intencionalmente que o aplicativo trave se os dados forem inválidos. Isso ajuda a revelar problemas cedo, em vez de continuar com dados corrompidos.
Encontrando o ID Máximo
Tim retorna ao TextConnector e explica como encontrar o maior ID:
int currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;
Ele observa que isso travará se o arquivo estiver vazio, então adiciona uma verificação:
if(prizes.Count > 0)
{
currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;
}
Isso garante que o primeiro registro receba um ID de 1.
Adicionando Modelo e Salvando
Tim adiciona o novo prêmio à lista e então converte a lista de volta em linhas de texto:
public static void SaveToPrizeFile(this List<PrizeModel> models, string fileName)
Ele usa interpolação de strings para criar cada linha CSV e adiciona a uma lista de strings. Finalmente, ele usa:
File.WriteAllLines(fileName.FullFilePath(), lines);
Tim explica que WriteAllLines sobrescreve o arquivo, o que é o comportamento desejado, pois atualiza os dados com conteúdo atualizado.
Retornando o Modelo
Tim conclui o método retornando o PrizeModel com o ID atribuído. Isso torna o novo prêmio utilizável no resto do aplicativo, assim como o SQL.
Testando a Conexão de Texto
Tim muda para Program.cs e altera a conexão de dados de SQL para Texto. Quando ele executa o aplicativo e cria prêmios, o sistema inicialmente trava devido a registros ausentes. Tim rapidamente corrige o bug com a verificação if(prizes.Count > 0) e então executa novamente.
Ele demonstra que os dados são salvos corretamente no arquivo PrizeModels.csv e mostra como o arquivo pode ser aberto no Notepad ou Excel.
Reflexões Finais — Métodos de Extensão e Namespaces
Tim termina a lição lembrando aos espectadores que os métodos de extensão só aparecem quando o namespace correto é incluído. Isso evita bagunça e possíveis conflitos de nomeação. Ele observa que essas duas lições criam uma base sólida para o restante do aplicativo e preparam o terreno para desenvolvimentos futuros.
