Clean Architecture a Blazor Server App

1. Kde umiestniť ViewModely?

Odporúčanie: Do prezentačnej vrstvy (Blazor projekt)

  • Dôvody:
    • ViewModely sú úzko prepojené s potrebami používateľského rozhrania.
    • Zbytočne by zaťažovali aplikačnú vrstvu, ktorá by mala zostať zameraná na aplikačnú logiku.
  • Výhody umiestnenia v prezentačnej vrstve:
    • Jednoduchosť: ViewModely sú ľahko dostupné pre komponenty Blazor.
    • Zodpovednosť za UI: ViewModely slúžia iba UI logike.
  • Kedy zvažovať ViewModely v aplikačnej vrstve?
    • Ak majú byť používané viacerými prezentačnými projektmi.
    • Ak je ViewModel súčasťou zdieľanej logiky.

2. Referencovanie projektu Domain

Odporúčanie: Referencujte Domain len v aplikačnej vrstve, nie v prezentačnej vrstve

  • Prečo referencovať Domain do aplikačnej vrstvy?
    • Domain vrstva obsahuje vaše entity a biznis logiku.
    • Prezentačná vrstva by mala komunikovať výlučne s aplikačnou vrstvou.
  • Prečo sa vyhnúť priamemu referencovaniu?
    • Porušenie závislostí: Prezentačná vrstva by nemala byť závislá na doméne.
    • Testovateľnosť: Jednoduchšie testovanie prezentačnej vrstvy.

3. Ako sa vyhnúť priamej práci s Domain v prezentačnej vrstve?

  • Použite DTO alebo ViewModely: Prezentačná vrstva by mala komunikovať výhradne cez aplikačnú vrstvu.

4. Prepojenie medzi vrstvami

Typická štruktúra Clean Architecture:

Solution/
├── Domain/
│   ├── Entities/
│   ├── ValueObjects/
│   └── Services/
├── Application/
│   ├── Interfaces/
│   ├── UseCases/
│   └── DTOs/
├── Infrastructure/
│   ├── Data/
│   ├── Services/
│   └── Configurations/
├── BlazorApp/ (Presentation layer)
│   ├── Pages/
│   ├── Components/
│   └── ViewModels/
    

Závislosti medzi vrstvami:

  • Domain vrstva: Nemá závislosti na žiadnej inej vrstve.
  • Aplikačná vrstva: Referencuje Domain vrstvu a koordinuje logiku.
  • Prezentačná vrstva: Referencuje Aplikačnú vrstvu.
  • Infra vrstva: Referencuje Aplikačnú a prípadne Domain vrstvu.

5. Príklad použitia DTO a ViewModel v Blazor Server App

Domain (Entity):

public class Customer
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}
    

Application (DTO):

public class CustomerDto
{
    public Guid Id { get; set; }
    public string FullName { get; set; }
    public string ContactEmail { get; set; }
}
    

Blazor App (ViewModel):

public class CustomerViewModel
{
    public string FullName { get; set; }
    public string ContactEmail { get; set; }
    public string DisplayName => $"{FullName} ({ContactEmail})";
}
    

Mapovanie v Aplikačnej vrstve:

public class CustomerService
{
    public CustomerDto MapToDto(Customer customer)
    {
        return new CustomerDto
        {
            Id = customer.Id,
            FullName = customer.Name,
            ContactEmail = customer.Email
        };
    }
}
    

Použitie v Blazor App:

@inject CustomerService CustomerService

@code {
    private List customers;

    protected override async Task OnInitializedAsync()
    {
        var customerDtos = await CustomerService.GetCustomers();
        customers = customerDtos.Select(dto => new CustomerViewModel
        {
            FullName = dto.FullName,
            ContactEmail = dto.ContactEmail
        }).ToList();
    }
}
    

Záver:

  • ViewModely by mali byť v prezentačnej vrstve (Blazor projekt).
  • Domain vrstva má byť izolovaná od prezentačnej vrstvy.
  • Použite DTO pre prenos dát medzi vrstvami a ViewModely pre manipuláciu dát v UI.

Máte projekt? Prvá konzultácia je zadarmo

Či už máte hotové zadanie alebo len nápad - odpoviem vám do 24 hodín.

Kapacita obmedzená: V danom čase aktívne pracujem maximálne na 2 projektoch súčasne, aby som zachoval vysokú kvalitu.

Napísať Email 📞 Zavolať teraz LinkedIn Profil