最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# MVC模式中應(yīng)該怎樣區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)?

 更新時間:2015年06月16日 10:53:10   投稿:junjie  
這篇文章主要介紹了C# MVC模式中應(yīng)該怎樣區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)?,這也小編做.NET項目時經(jīng)常思考和讓人混亂的一個問題,這篇文章寫的挺好,一下清晰了許多,需要的朋友可以參考下

現(xiàn)在的大部分框架都是 MVC 模式,但 MVC 三個部分怎么配合,這里做了一點總結(jié):

基本原則:業(yè)務(wù)邏輯代碼應(yīng)該寫在 M 里面,而應(yīng)用程序邏輯應(yīng)該寫在 C 里面。V 只是單純的展示數(shù)據(jù)。

舉個簡單例子吧:用戶往購物車添加一個商品

用戶點擊商品的“添加到購物車”按鈕,引起一次請求。服務(wù)器開始處理該請求,過程:

1、檢查當前用戶是否有權(quán)限(比如是否已經(jīng)登錄、用戶帳戶狀態(tài)、是否可以購物等)
2、檢查要添加的商品ID是否有效、
3、檢查要添加的商品庫存是否足夠
4、將商品加入購物車,并保存購物車狀態(tài)
5、反饋信息

在上述流程中:

1: 是應(yīng)用程序邏輯(一般由框架實現(xiàn)):因為和“添加商品到購物車”這個業(yè)務(wù)沒有直接關(guān)系
2: 業(yè)務(wù)邏輯:不能購買不存在的商品,這是業(yè)務(wù)進行的基本條件
3: 業(yè)務(wù)邏輯:商品庫存決定了是否可以購買此商品,這是業(yè)務(wù)進行的基本條件
4: 業(yè)務(wù)邏輯
5: 應(yīng)用程序邏輯

用代碼表示的,可能像下面這樣:

復制代碼 代碼如下:

// Cart控制器
class Controller_Cart
{
    function actionAddGoods()
    {
        $goods_id = (int)$_GET['goods_id'];
        Cart::instance()->add($goods_id)->save();
       
        echo '添加成功';
    }
}


// Cart 模型
class Cart
{
    /**
     * 購物車中的所有項目
     */
    public $items = array();
  
    /**
     * 單子模式,返回購物車對象的唯一實例
     */
    static function instance()
    {
        ...
    }
  
    function add($goods_id, $quantity = 1)
    {
        $goods = Goods::find($goods_id)->get();
        // 檢查 id 和庫存數(shù)
        if ($goods->id && $quantity > $goods->remaining)
        {
            // 添加商品到購物車
            $this->items[] = array($goods, $quantity);
        }
        else
        {
            throw new CartExecption('無效的商品 ID');
        }
        return $this;
    }
}


這個代碼不完整,但是演示了最重要的部分,就是應(yīng)用程序邏輯和業(yè)務(wù)邏輯的分離。
如果這個流程走下去,用戶要結(jié)算了,那么代碼如下:
復制代碼 代碼如下:

class Controller_Cart
{
    function actionCheckOut()
    {
        Cart::instance()->checkout();
       
        echo '成功';
    }
}
class Cart
{
    function checkout()
    {
        // 開啟一個數(shù)據(jù)庫事務(wù)
        ....
       
        try
        {
            // 創(chuàng)建一個新的訂單對象
            // $this->owner 是當前購物車的所有者(用戶)
            $order = new Order($this->owner);
           
            // 將購物車中的所有商品添加到訂單中
            foreach ($this->items as $item)
            {
                list($goods, $quantity) = $item;
                $order->add($goods, $quantity);
            }
            // 保存訂單
            $order->save();
           
            // 清空購物車
            $this->items = array();
        }
        catch (Exception $ex)
        {
            // 出錯了,回滾事務(wù)
            ....
              
            // 再重新拋出異常
            throw $ex;
        }
       
        // 返回新建的訂單
        return $order;
    }
}


class Order extends Model
{
    public $items;
  
    function add($goods, $quantity)
    {
        $this->items[] = array($goods, $quantity);
        return $this;
    }
  
    function save()
    {
        foreach ($this->items as $item)
        {
            list($goods, $quantity) = $item;
            // 保存訂單時,減少訂單中每一個商品的庫存數(shù)
            $goods->decrRemaining($quantity);
        }
       
        // 調(diào)用父類的保存
        parent::save();
       
        return $this;
    }
}


結(jié)算的代碼很容易理解:
1、調(diào)用購物車的 checkout() 方法
2、開啟數(shù)據(jù)庫事務(wù),這樣當保存訂單失敗時(例如庫存數(shù)不夠)則回滾,確保數(shù)據(jù)庫內(nèi)容沒有受影響
3、將購物車中的所有商品添加到訂單
4、調(diào)用訂單對象的 save() 方法
  4.1、遍歷訂單的所有項目,減少商品的庫存(如果此時失敗,商品的 decrRemaining() 方法會拋出異常)
  4.2、調(diào)用模型父類的 save() 方法
5、清空購物車,返回新建的訂單對象

整個流程我們假定創(chuàng)建訂單就等同于客戶確認訂單,此時減少庫存。也有可能是后臺確認訂單配貨后才減少庫存,這和賣家的經(jīng)營策略有關(guān)。

這兩個例子里面,業(yè)務(wù)邏輯都在模型中實現(xiàn),控制器(也就是封裝應(yīng)用程序邏輯的層)僅僅完成處理輸入數(shù)據(jù)、調(diào)用業(yè)務(wù)方法、反饋結(jié)果等任務(wù)。

相關(guān)文章

  • C#中正則表達式的3種匹配模式

    C#中正則表達式的3種匹配模式

    本文主要介紹在C#中正則匹配的三種模式:單行模式(Singleline)、多行模式(Multiline)與忽略大小寫(IgnoreCase),希望能幫到大家。
    2016-05-05
  • C# 清除cookies的代碼

    C# 清除cookies的代碼

    不同的瀏覽器會把cookie文件保存在不同的地方.這篇文章主要介紹了C# 清除cookies的代碼,需要的朋友可以參考下
    2016-10-10
  • C#實現(xiàn)23種常見的設(shè)計模式的示例詳解

    C#實現(xiàn)23種常見的設(shè)計模式的示例詳解

    設(shè)計模式通常分為三個主要類別:創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式,這些模式是用于解決常見的對象導向設(shè)計問題的最佳實踐,本文為大家整理了23種常見的設(shè)計模式的實現(xiàn)代碼,需要的可以參考一下
    2023-06-06
  • C#單例模式與多線程用法介紹

    C#單例模式與多線程用法介紹

    這篇文章介紹了C#單例模式與多線程的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C# String字符串案例詳解

    C# String字符串案例詳解

    這篇文章主要介紹了C# String字符串案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C#中感嘆號(!) 的作用總結(jié)

    C#中感嘆號(!) 的作用總結(jié)

    這篇文章主要給大家總結(jié)介紹了C#中感嘆號(!) 的作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 一文帶你了解 C# DLR 的世界(DLR 探秘)

    一文帶你了解 C# DLR 的世界(DLR 探秘)

    DLR 是 C#4.0 新引進來的概念,其主要目的就是為了動態(tài)綁定與交互。下面小編給大家?guī)硪黄诲e教程,一文帶你了解 C# DLR 的世界,需要的朋友可以參考下
    2020-02-02
  • unity使用鏈表實現(xiàn)貪吃蛇游戲

    unity使用鏈表實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了unity使用鏈表實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#之CLR內(nèi)存字符串常量池(string)

    C#之CLR內(nèi)存字符串常量池(string)

    這篇文章主要介紹了C#之CLR內(nèi)存字符串常量池(string),對于學習和理解C#內(nèi)存原理很有幫助,需要的朋友可以參考下
    2014-08-08
  • C#為配置文件加密的實現(xiàn)方法

    C#為配置文件加密的實現(xiàn)方法

    這篇文章主要介紹了C#為配置文件加密的實現(xiàn)方法,可實現(xiàn)對配置文件中的敏感信息進行加密,非常具有實用價值,需要的朋友可以參考下
    2014-10-10

最新評論

手机| 灵山县| 高台县| 陆丰市| 安多县| 青龙| 屏边| 南城县| 巩义市| 普兰县| 汶川县| 清涧县| 湘阴县| 当涂县| 九江市| 拜泉县| 安达市| 江阴市| 吴旗县| 来凤县| 杭锦旗| 砚山县| 金川县| 洛阳市| 全南县| 延安市| 宜丰县| 若羌县| 新建县| 灵台县| 德安县| 六枝特区| 防城港市| 仪征市| 简阳市| 巴林右旗| 茶陵县| 句容市| 贺州市| 历史| 佛山市|