0

データベースにマップされた Entity Framework を使用しています。多くの BasketItem モデルを持つことができる Basket モデルがあり、プロモーション モデルとクーポン モデルがあります。これは e コマースのチェックアウト機能のためのもので、これがどのように機能するのかわかりません。

BasketItems には Basket との外部キー関係があるため、部分クラスの Basket アイテムの Subtotal を合計したい場合は、次のようにすることができます。

        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;
        }

ビュー ページでこれを使用したくありません。また、使用するたびにコンテキストを送信する必要があります。

解決策 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 プロパティを取得する最良の方法を知りたいと思います。

長い間お読みいただき、誠にありがとうございました:)

4

1 に答える 1

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

于 2012-10-24T17:51:57.017 に答える