ASP.NET MVC--传递依赖关系时的最佳实践。

问题描述 投票:0回答:1

我有一个问题,我试着在谷歌上搜索,但说实话,我真的不知道如何搜索,甚至不知道如何提出这个特殊的问题。

让我们想象一下,我有以下内容。

控制器


        [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. 有没有比使用 静态 用于建立列表?我真的不想在控制器里面做。
  2. 把IM映射服务传给方法看起来不对。但也许我只是太挑剔了。这是最好的方法吗?

另一种情况,我需要将Session状态传递给一个静态的帮助类。

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

或者,有时候我也需要把我的 "unifOfWork "作为参数传递给帮助者方法,因为我使用了仓库模式。

我经常遇到这个 "问题",但我还没有找到最好的方法。

PS: 如果你们谁有更好的标题,请告诉我,这样我就可以更新它。

c# asp.net asp.net-mvc-5 architecture
1个回答
2
投票

Controller如果你使用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);
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.