TOOGLE
Repository Service Pattern
-
Back-End
### **📌 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();
}