Open
Code
Home
Create
List
Home
Create
List
Edit
Title
Content
### **📌 1. Separação de Responsabilidades (SoC - Separation of Concerns)** Cada camada tem sua responsabilidade clara: ✅ **Controller (`HomeController`)** → Apenas lida com requisições HTTP e respostas. Receber requisições HTTP, chamar o Service, e devolver a resposta apropriada. ✅ **Service (`BlobService`)** → Contém a lógica de negócio (validações, chamadas ao repositório). Lógica de negócios, validações e regras da aplicação. Ele chama o Repository para interagir com os dados. ✅ **Repository (`BlobRepository`)** → Interage diretamente com o **Azure Blob Storage**. Acesso direto ao banco de dados ou ao armazenamento (ex: Azure Blob Storage). Não contém lógica de negócios. _______________________________________________________________________________________ Controller - Antes [HttpPost("delete/{fileName}")] public async Task<IActionResult> DeleteFile(string fileName) { try { var blobContainerClient = _blobStorageClientFactory.CreateBlobContainerClient(); var blobClient = blobContainerClient.GetBlobClient(fileName); var response = await blobClient.DeleteIfExistsAsync(); if (response) { TempData["ToastMessage"] = $"Arquivo '{fileName}' excluído com sucesso!"; TempData["ToastColor"] = "success"; } else { TempData["ToastMessage"] = $"Arquivo '{fileName}' não encontrado."; TempData["ToastColor"] = "danger"; } return RedirectToAction("Index"); } catch (Exception ex) { TempData["ToastMessage"] = $"Erro ao excluir o arquivo: {ex.Message}"; TempData["ToastColor"] = "danger"; return RedirectToAction("Index"); } } _______________________________________________________________________________________ Depois _______________________________________________________________________________________ Controller [HttpPost("delete/{fileName}")] public async Task<IActionResult> DeleteFile(string fileName) { var result = await _blobService.DeleteFileAsync(fileName); TempData["ToastMessage"] = result ? $"Arquivo '{fileName}' excluído com sucesso!" : $"Arquivo '{fileName}' não encontrado."; TempData["ToastColor"] = result ? "success" : "danger"; return RedirectToAction("Index"); } _______________________________________________________________________________________ IService e Service Task<bool> DeleteFileAsync(string fileName); public async Task<bool> DeleteFileAsync(string fileName) { try { return await _blobRepository.DeleteBlobAsync(fileName); } catch(Exception ex) { Console.WriteLine($"Erro ao excluir arquivo: {ex.Message}"); return false; } } _______________________________________________________________________________________ IRepository Repository Task<bool> DeleteBlobAsync(string fileName); public async Task<bool> DeleteBlobAsync(string fileName) { var blobContainerClient = _blobStorageClientFactory.CreateBlobContainerClient(); var blobClient = blobContainerClient.GetBlobClient(fileName); return await blobClient.DeleteIfExistsAsync(); }
Image
Category
Categories
Front-End
Back-End
Database
DevOps
Others
Password
Back to List