ASP.NET MVC - 传递依赖项时的最佳实践

ASP.NET MVC - Best practices when passing dependencies

我有一个问题,我尝试 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. 有没有比使用 static 更好的方法来构建列表?我真的不想在控制器里面做。
  2. 将 IMappingService 传递给方法看起来不正确。但也许我只是挑剔。这是最好的方法吗?

另一种情况,我需要将 Session 状态传递给静态助手 class。

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

或者,有时我需要将我的 "unifOfWork" 作为参数传递给辅助方法,因为我使用存储库模式。

这个 "problem" 我遇到过很多次,但我还没有找到最好的方法。

PS:如果你们中的任何人对这个问题有更好的标题,请告诉我,以便我更新。

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

}