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ś. :)
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ś. :)
@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>();
Ale nie potrzebujesz do tego interfejsów. builder.Services.AddScoped<HomeService>();
też zadziała.
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
@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
No to jeszcze wymyśl jakieś ficzery biznesowe do tego projektu wymagające jakiejś logiki biznesowej, aby napisać trochę sensownych testów.