Ocena dwóch projektów webowych

0

Zdecyduj się na jedną konwencję:

_logger = logger;
this.homeService = homeService;

Interfejsy do serwisów - co mają na celu?

Weź rób Pull Requesty, będzie łatwiej oglądać co zmieniłeś. :)

0

@somekind: Poprzez użycie interfejsów mogę przenieść funkcje z serwisów do konstruktora w kontrolerze i wywołać je tam.

W pliku Program.cs przenosze te wszystkie funkcje za pomocą interfejsów.
Tutaj kod odpowiedzialny za to:

builder.Services.AddScoped<IHomeService, HomeService>();
builder.Services.AddScoped<IAccountService, AccountService>();
builder.Services.AddScoped<IOrderService, OrderService>();
builder.Services.AddScoped<IProductService, ProductService>();
3

Ale nie potrzebujesz do tego interfejsów. builder.Services.AddScoped<HomeService>(); też zadziała.

2
public async Task OrderProduct(HttpContext httpContext)
{
    int userID;

    var userIDString = httpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
    int.TryParse(userIDString, out userID);
    ...
}

Nie podoba mi się przekazywanie HttpContextu jako parametru. Jeżeli nie chcesz korzystać z UserContext z mojej poprzedniej odpowiedzi to z poziomu kontrolera dziedziczącego po ControllerBase masz dostęp do właściwości User o typie ClaimsPrincipal, możesz sobie napisac extensions method do wyciągania ID.

//czemu GET a nie POST?
public async Task<IActionResult> Order()
{
    var userId = User.GetId();
    await orderService.OrderProduct(userId);

    return LocalRedirect("/Home/Index");
}

// ClaimsPrincipalExtensions.cs:
public static int GetId(this ClaimsPrincipal cp) => ...

Jednak dalej uważam, że przekazywanie ID jako parametru nie jest najlepszym rozwiązaniem. I rozwiązanie tego typu uważam za lepsze:

public class OrderService
{
    private UserContext userContext;
    public OrderService(..., UserContext userContext)
    {
        ...
        this.userContext = userContext;
    }
    

    public async Task DeleteProduct(int productID)
    {
        var userId = userContext.UserId;
        ...
    }

    public async Task OrderProduct()
    {
        var userId = userContext.UserId;
        ...
    }

}

Żeby to działało trzeba dodać services.AddHttpContextAccessor(); w metodzie ConfigureServices w Startup.cs

0

@somekind: Usunąłem te interfejsy z serwisów oraz zmieniłem AddScoped nie było tam zbyt wiele rzeczy do zmiany, ale mam nadzieje, że jakoś to wpływa na jakość :D

@Kokoniłaj: Zaimplementowałem twój kod dotyczący odczytywania id użytkownika i muszę przyznać się, że dzięki temu dowiedziałem się, że jest takie coś jak IHttpContextAccessor za co dziękuję, bo wydaję się to bardzo przydatne :D

1

No to jeszcze wymyśl jakieś ficzery biznesowe do tego projektu wymagające jakiejś logiki biznesowej, aby napisać trochę sensownych testów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1