Unable to resolve service for type 'Models.Dto.ResponseDTO' while attempting to activate 'Controllers.CartAPIController'
У меня возникла проблема с корзиной. Я не могу понять как ее решить. Прошу помочь.
using AutoMapper;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Services.ShoppingCartAPI;
using Services.ShoppingCartAPI.Data;
using Services.ShoppingCartAPI.Extensions;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});
IMapper mapper = MappingConfig.RegisterMaps().CreateMapper();
builder.Services.AddSingleton(mapper);
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(option =>
{
option.AddSecurityDefinition(name: "Bearer", securityScheme: new OpenApiSecurityScheme
{
Name = "Authorization",
Description = "Enter the Bearer Authorization string as following: 'Bearer Generated-JWT-Token'",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
option.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type= ReferenceType.SecurityScheme,
Id =JwtBearerDefaults.AuthenticationScheme
}
}, new string[]{ }
}
});
});
builder.AddAppAutherization();
builder.Services.AddAuthorization();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
ApplyMigration();
app.Run();
void ApplyMigration()
{
using (var scope = app.Services.CreateScope())
{
var _db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
if (_db.Database.GetPendingMigrations().Count() > 0)
{
_db.Database.Migrate();
}
}
}
Код из самого контроллера
using AutoMapper;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Services.ShoppingCartAPI.Data;
using Services.ShoppingCartAPI.Models;
using Services.ShoppingCartAPI.Models.Dto;
using System.Reflection.PortableExecutable;
namespace Services.ShoppingCartAPI.Controllers
{
[Route("api/car")]
[ApiController]
public class CartAPIController : ControllerBase
{
private ResponseDTO _response;
private IMapper _mapper;
private readonly AppDbContext _db;
public CartAPIController(ResponseDTO response, IMapper mapper, AppDbContext db)
{
_db = db;
this._response = new ResponseDTO();
_mapper = mapper;
}
[HttpPost("CartUpsert")]
public async Task<ResponseDTO> CartUpsert(CartDTO cartDto)
{
try
{
var cartHeaderFromDb = await _db.CartHeaders.AsNoTracking().FirstOrDefaultAsync(u => u.UserId == cartDto.CartHeader.UserId);
if (cartHeaderFromDb == null)
{
//create header and details
CartHeader cartHeader = _mapper.Map<CartHeader>(cartDto.CartHeader);
_db.CartHeaders.Add(cartHeader);
await _db.SaveChangesAsync();
cartDto.CartDetails.First().CartHeaderId = cartHeader.CartHeaderId;
_db.CartDetails.Add(_mapper.Map<CartDetails>(cartDto.CartDetails.First()));
await _db.SaveChangesAsync();
}
else
{
//if header is not null
//check if details has same product
var cartDetailsFromDb = await _db.CartDetails.AsNoTracking().FirstOrDefaultAsync(
u => u.ProductId == cartDto.CartDetails.First().ProductId &&
u.CartHeaderId == cartHeaderFromDb.CartHeaderId);
if (cartDetailsFromDb == null)
{
//create cartdetails
cartDto.CartDetails.First().CartHeaderId = cartHeaderFromDb.CartHeaderId;
_db.CartDetails.Add(_mapper.Map<CartDetails>(cartDto.CartDetails.First()));
await _db.SaveChangesAsync();
}
else
{
//update count in cart details
cartDto.CartDetails.First().Count += cartDetailsFromDb.Count;
cartDto.CartDetails.First().CartHeaderId += cartDetailsFromDb.CartHeaderId;
cartDto.CartDetails.First().CartDetailsId += cartDetailsFromDb.CartDetailsId;
_db.CartDetails.Update(_mapper.Map<CartDetails>(cartDto.CartDetails.First()));
await _db.SaveChangesAsync();
}
}
_response.Result = cartDto;
}
catch (Exception ex)
{
_response.Message = ex.Message.ToString();
_response.IsSuccess = false;
}
return _response;
}
}
}
Код ResponseDTO
public class ResponseDTO
{
public object? Result { get; set; }
public bool IsSuccess { get; set; } = true;
public string Message { get; set; } = "";
}
Источник: Stack Overflow на русском