Как создать модель класса для нескольких коллекций в C #?

#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;
    }
  

и это должно сработать.