我正在使用映射到我的数据库的Entity Framework。我有一个篮子模型,可以有很多BasketItem模型,我有促销和优惠券模型。 这是电子商务结账功能,我只是不明白这是如何工作的,这里是:
因为如果我想在部分课程中总结我的篮子项目的小计,我的BasketItems与篮子有外键关系,我可以这样做:
public decimal Subtotal {
get {
return this.BasketItems.Sum(pb => pb.Subtotal);
}
}
这很有用,因为我可以在视图中使用它,通过DB上下文并且它是DRY等等没有任何问题。
现在我想将促销或优惠券应用于我的小计,理想情况下我希望它看起来像这样:
public decimal DiscountedSubtotal {
get {
decimal promotions_discount = 0;
decimal coupons_discount = 0;
return Subtotal - promotions_discount - coupons_discount;
}
}
但是,如果没有在我的数据库中创建一些疯狂和不必要的关系,或者为了让这项功能发挥作用,就无法访问促销或优惠券。我不知道该怎么做才能克服这个问题。
解决方案1:
public decimal DiscountedSubtotal(DatabaseEntities db) {
decimal promotions_discount = from p in db.Promotions
select p.Amount;
decimal coupons_discount = from c in db.Coupons
select c.Amount;
return Subtotal - promotions_discount - coupons_discount;
}
我不想在我的View页面中使用它,而且每次我想使用它时都必须通过我的上下文发送。
解决方案2 :(未经测试)
public List<Promotion> Promotions { get; set; }
public List<Coupon> Coupons { get; set; }
public Basket()
: base() {
DatabaseEntities db = new DatabaseEntities();
Promotions = db.Promotions.ToList();
Coupons = db.Coupons.ToList();
}
有点轻微的黑客攻击可以为我提供促销和优惠券的参考,但我之前创建新的上下文时遇到了问题,我不知道是否有更好的方法让我获得DiscountedSubtotal属性我理想情况下等。
总而言之,我想知道获得DiscountedSubtotal属性的最佳方法。
非常感谢并为这么长的阅读道歉:)
答案 0 :(得分:1)
我认为这里的问题是你并没有真正使用一致的架构。
在大多数情况下,您应该有一个业务层来处理这种逻辑。然后,该业务层将具有CalculateDiscountForProduct()
或CalculateNetPrice()
等函数,这些函数将发送到数据库并检索完成业务规则所需的数据。
业务类将与返回数据对象的数据层进行通信。您的视图只需要它的视图模型,您可以从业务层返回的业务对象中填充它。
一种典型的方法可能是:
public ActionResult Cart() {
var model = _cartService.GetCurrentCart(userid);
return View(model);
}
因此,当您应用折扣或优惠券时,您可以调用_cartService.ApplyDiscount(model.DiscountCode);
之类的方法,然后将新模型返回到视图。
您可能会很好地研究Mvc Music Store示例项目,因为它包含购物车功能和促销代码。
http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-1