ASP. NET MVC - Лучшие практики при передаче зависимостей - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть вопрос, который я пытался найти в Google, но, честно говоря, я действительно не знаю, как искать или даже задавать этот конкретный вопрос.

Давайте представим, что у меня есть следующее:

Контроллер


        [HttpGet]
        public virtual ActionResult Summary()
        {
            var summaryViewModel = new CheckoutSummaryViewModel()
            {
                Products = ProductViewModel.BuildListFromShoppingCart(GetShoppingCart())
            };
            return View("_Summary", summaryViewModel);
        }

ProductViewModel

    public class ProductViewModel
    {
        public string Name
        {
            get; set;
        }

        public static List<ProdutoCheckoutViewModel> BuildListFromShoppingCart(ShoppingCart shoppingCart, IMappingService mappingService)
        {
            var itemsInCart = new List<ProductViewModel>();
            foreach (var item in shoppingCart.ItemsInCart)
            {
                var itemViewModel = mappingService.Map<Product, ProductViewModel>(item.Product);
                itemViewModel.Quantidade = item.Quantity;
                itemsInCart.Add(itemViewModel);
            }

            return itemsInCart;
        }
    }

Это не рабочий код. Это просто, чтобы я мог объяснить, что я имею в виду.

Это правильный способ сделать это?

  1. Есть ли лучший способ, чем использовать stati c для построения списка? Я действительно не хочу делать это внутри контроллера.
  2. Передача IMappingService методу выглядит неправильно. Но, может быть, я просто привередлива. Это лучший способ?

Другой случай, когда мне нужно передать Session State в класс помощника stati c.

        public static Guid GetCheckoutId(HttpSessionStateBase session)
        {
            return (Guid)session["checkoutId"];
        }

Или, кроме того, иногда мне нужно передать в качестве параметра вспомогательным методам мой "unifOfWork", поскольку я использую шаблон репозитория.

Я столкнулся с этим " проблем "много и я пока не нашел лучшего способа это сделать.

PS: Если у кого-то из вас есть этот вопрос лучше, скажите, пожалуйста, чтобы я мог его обновить.

1 Ответ

2 голосов
/ 23 апреля 2020
Контроллер

Если вы используете DI, он будет выглядеть примерно так:

public class CheckoutController 
{
    private readonly ICheckoutService _checkoutService;

    public CheckoutController(ICheckoutService checkoutService) =>
        _checkoutService = checkoutService;

    [HttpGet]
    public virtual ActionResult Summary()
    {
        var shoppingCartData = _checkoutService.GetShoppingCart(Session["..."]);
        // The viewmodel here could be returned by your service or the service
        // would return all required data and the viewmodel simply transforms that Dto into what is needed by the UI

        var summaryViewModel = new CheckoutSummaryViewModel()
        {
            Products = shoppingCartData 
        };
        return View("_Summary", summaryViewModel);
    }

}
...