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;
}
}
这不是生产代码。只是为了让我解释一下我的意思。
这是正确的做法吗?
- 有没有比使用 static 更好的方法来构建列表?我真的不想在控制器里面做。
- 将 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);
}
}
我有一个问题,我尝试 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;
}
}
这不是生产代码。只是为了让我解释一下我的意思。
这是正确的做法吗?
- 有没有比使用 static 更好的方法来构建列表?我真的不想在控制器里面做。
- 将 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);
}
}