#mongodb #model #.net-core
#mongodb #Модель #.net-core
Вопрос:
Я пытаюсь создать веб-сервисы для корзины покупок с mongodb
помощью и dotnet core
веб-api. В моей коллекции корзин есть информация о продукте. Продукт должен быть множественным массивом или объектом, и я попробовал одно решение, но у меня эта ошибка :
При обработке запроса произошло необработанное исключение. Исключение InvalidOperationException: не удается разрешить службу для типа ‘CartService’ при попытке активировать ‘CartsController’.
Это выглядит как коллекция корзины:
{
"_id" : ObjectId("5cab18a057ab66f2536feeb9"),
"Status" : "Inactive",
"Product" : [
{
"_id" : ObjectId("5ca9b27dbec46268305ce427"),
"Quantity" : 1.0,
"Name" : "Samsung",
"Price" : 1000.0
},
{
"_id" : ObjectId("5ca9b27dbec46268305ce427"),
"Quantity" : 2.0,
"Name" : "Samsung",
"Price" : 9999.0
}
],
"modified_on" : "5/4/2019"
}
Это модель класса:
public class Cart
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("Status")]
public string Status { get; set; }
[BsonElement("Product")]
public Product Product { get; set; }
[BsonElement("modified_on")]
public DateTime modified_on { get; set; }
}
Служба корзины:
public class CartService
{
private readonly IMongoCollection<Cart> _carts;
public CartService(IConfiguration config)
{
var client = new MongoClient(config.GetConnectionString("WebShopDb"));
var database = client.GetDatabase("WebShopDb");
_carts = database.GetCollection<Cart>("Carts");
}
public List<Cart> Get()
{
return _carts.Find(cart => true).ToList();
}
public Cart Get(string id)
{
return _carts.Find<Cart>(cart => cart.Id == id).FirstOrDefault();
}
public Cart Create(Cart cart)
{
_carts.InsertOne(cart);
return cart;
}
public void Update(string id, Cart cartIn)
{
_carts.ReplaceOne(cart => cart.Id == id, cartIn);
}
public void Remove(Cart cartIn)
{
_carts.DeleteOne(cart => cart.Id == cartIn.Id);
}
public void Remove(string id)
{
_carts.DeleteOne(cart => cart.Id == id);
}
}
Контроллер корзины:
[Route("api/[controller]")]
[ApiController]
public class CartsController : ControllerBase
{
private readonly CartService _cartService;
public CartsController(CartService cartService)
{
_cartService = cartService;
}
[HttpGet]
public ActionResult<List<Cart>> Get()
{
return _cartService.Get();
}
[HttpGet("{id:length(24)}", Name = "GetCart")]
public ActionResult<Cart> Get(string id)
{
var cart = _cartService.Get(id);
if (cart == null)
{
return NotFound();
}
return cart;
}
[HttpPost]
public ActionResult<Cart> Create(Cart cart)
{
_cartService.Create(cart);
return CreatedAtRoute("GetCart", new { id = cart.Id.ToString() }, cart);
}
[HttpPut("{id:length(24)}")]
public IActionResult Update(string id, Cart cartIn)
{
var cart = _cartService.Get(id);
if (cart == null)
{
return NotFound();
}
_cartService.Update(id, cartIn);
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public IActionResult Delete(string id)
{
var cart = _cartService.Get(id);
if (cart == null)
{
return NotFound();
}
_cartService.Remove(cart.Id);
return NoContent();
}
}
Комментарии:
1. Для начала, ваше свойство product должно быть коллекцией, ваша модель содержит его как единый продукт, а ваш bson отображает его как массив. Что касается ошибки, ваш CartController ожидает объект CartsService, но у него его нет.
2. Продукты это коллекция, но я не публиковал это здесь.
3. Если вы хотите таким образом передать объект в свой contstructor контроллера, вам необходимо настроить его с помощью контейнера IOC. .NET Core делает это невероятно простым. learn.microsoft.com/en-us/aspnet/core/fundamentals /…
4. Спасибо. Я решил.
Ответ №1:
Вам необходимо зарегистрировать эту службу в IoC. Лучший способ — следующий:
Создайте интерфейс ICartService со всеми методами, которые у вас будут в реализации CartService:
public interface ICartService {
List<Cart> Get();
Cart Get(string id);
Cart Create(Cart cart);
void Update(string id, Cart cartIn);
void Remove(Cart cartIn);
void Remove(string id);
}
реализуйте этот интерфейс в CartService.cs:
public class CartService : ICartService
{
private readonly IMongoCollection<Cart> _carts;
Зарегистрируйте эту службу в Startup.cs (поскольку в .NET Core включен IoC)
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<ICartService, CartService>();
...
Краткое объяснение типов объектов (ограниченный, переходный, одноэлементный):
Переходные объекты всегда разные; новый экземпляр предоставляется каждому контроллеру и каждой службе.
Объекты с областью видимости одинаковы в запросе, но различаются в разных запросах.
Одноэлементные объекты одинаковы для каждого объекта и каждого запроса.
и измените CartsController на:
[Route("api/[controller]")]
[ApiController]
public class CartsController : ControllerBase
{
private readonly ICartService _cartService;
public CartsController(ICartService cartService)
{
_cartService = cartService;
}
и это должно сработать.