Как создать модель класса для множественной коллекции в C #? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь создать веб-сервисы для корзины покупок с mongodb и dotnet core web 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 Ответ

1 голос
/ 08 апреля 2019

Вам необходимо зарегистрировать эту услугу в 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>();
        ...

Быстрое объяснение типов объектов (Scoped, Transient, Singleton)):

Временные объекты всегда разные;новый экземпляр предоставляется каждому контроллеру и каждой службе.

Объекты области действия одинаковы в запросе, но различаются для разных запросов.

Объекты Singleton одинаковы для каждого объекта и каждого запроса.

и измените CartsController на:

[Route("api/[controller]")]
[ApiController]
public class CartsController : ControllerBase
{
    private readonly ICartService _cartService;

    public CartsController(ICartService cartService)
    {
        _cartService = cartService;
    }

, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...