DDD領(lǐng)域驅(qū)動設(shè)計——領(lǐng)域?qū)?/h1>

前言

源碼地址:
https://github.com/SkylerSkr/Skr3D

領(lǐng)域是DDD的核心要點。在領(lǐng)域?qū)勇阌埃覀儜?yīng)該處理掉該領(lǐng)域的全部業(yè)務(wù)。在這里我們只需要操作領(lǐng)域?qū)ο蟆?br> 領(lǐng)域?qū)ο笕绾纬志没I(lǐng)域?qū)ο笤趺达@示到UI層,這些都不是領(lǐng)域?qū)涌紤]的事情洁墙。
我們以電商項目為例,先對電商進(jìn)行建模戒财。

領(lǐng)域?qū)嶓w:

領(lǐng)域?qū)嶓w就是將領(lǐng)域中遇到的對象進(jìn)行建模热监,以實體的方式表達(dá)出來。
例如:在電商項目中饮寞,主訂單下孝扛,有多個子訂單收獲地址。

    public class Order : Entity
    {
        protected Order()
        {
        }
        public Order(Guid id, string name,Address address, List<OrderItem> orderItem)
        {
            Id = id;
            Name = name;
            Address = address;
            OrderItem = orderItem;
        }
        /// <summary>
        /// 訂單名
        /// </summary>
        public string Name { get; private set; }
        /// <summary>
        /// 收獲地址
        /// </summary>
        public Address Address { get; private set; }

        /// <summary>
        /// 訂單詳情
        /// </summary>
        public virtual ICollection<OrderItem> OrderItem { get; private set; }
    }

    public class OrderItem : Entity
    {

        /// <summary>
        /// 詳情名
        /// </summary>
        public string Name { get; private set; }

        public virtual Order Order { get; set; }
    }

    /// <summary>
    /// 地址
    /// </summary>
    //[Owned]
    public class Address : ValueObject<Address>
    {
        /// <summary>
        /// 省份
        /// </summary>
        public string Province { get; private set; }

        /// <summary>
        /// 城市
        /// </summary>
        public string City { get; private set; }

        /// <summary>
        /// 區(qū)縣
        /// </summary>
        public string County { get; private set; }

        /// <summary>
        /// 街道
        /// </summary>
        public string Street { get; private set; }


        public Address() { }
        public Address(string province, string city,
            string county, string street)
        {
            this.Province = province;
            this.City = city;
            this.County = county;
            this.Street = street;
        }
    }

從這3個實體類中幽崩,我們得出以下定義疗琉。
聚合根:Order,根實體歉铝,在領(lǐng)域中的最小單位,子節(jié)點有普通的領(lǐng)域?qū)嶓w和值類型凑耻。
普通的領(lǐng)域?qū)嶓w:OrderItem太示,有獨立的標(biāo)識。
值類型:Address香浩,類似地址這種不需要標(biāo)識的數(shù)據(jù)类缤,是一個不可更改的值。比如我在某寶買了東西邻吭,地址寫了上海餐弱,然后去用戶模塊把自己收獲地址改成北京,但是訂單的地址應(yīng)該是根據(jù)下單時候填寫的才對囱晴。

領(lǐng)域?qū)ο蟮腃RUD:

我們前面也說了膏蚓,在領(lǐng)域?qū)永镏惶幚眍I(lǐng)域內(nèi)的事情。將領(lǐng)域?qū)ο筮M(jìn)行建模得到實體畸写,讓我們可以用程序操作領(lǐng)域?qū)ο笸郧啤5俏覀內(nèi)绾潍@取領(lǐng)域?qū)ο螅⑵涑志没@都不需要我們關(guān)心枯芬。我們只需在領(lǐng)域?qū)勇暶髁顺志没涌诼郾剩尰A(chǔ)設(shè)施層去實現(xiàn)它。

    /// <summary>
    /// 定義泛型倉儲接口千所,并繼承IDisposable狂魔,顯式釋放資源
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public interface IRepository<TEntity> : IDisposable where TEntity : class
    {
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="obj"></param>
        void Add(TEntity obj);
        /// <summary>
        /// 根據(jù)id獲取對象
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        TEntity GetById(Guid id);
        /// <summary>
        /// 獲取列表
        /// </summary>
        /// <returns></returns>
        IQueryable<TEntity> GetAll();
        /// <summary>
        /// 根據(jù)對象進(jìn)行更新
        /// </summary>
        /// <param name="obj"></param>
        void Update(TEntity obj);
        /// <summary>
        /// 根據(jù)id刪除
        /// </summary>
        /// <param name="id"></param>
        void Remove(Guid id);
        /// <summary>
        /// 保存
        /// </summary>
        /// <returns></returns>
        int SaveChanges();
    }

    /// <summary>
    /// IOrderRepository接口
    /// 注意,這里我們的對象淫痰,是領(lǐng)域?qū)ο?    /// </summary>
    public interface IOrderRepository : IRepository<Order>
    {
        //一些Student獨有的接口
        Order GetByName(string name);
    }

領(lǐng)域?qū)ο笕绾纬志没綌?shù)據(jù)庫最楷,這是基礎(chǔ)設(shè)施層要解決的問題。
我們只需要定義好對領(lǐng)域?qū)ο蟛僮鞯某志没涌诩纯伞?br> PS:持久化接口操作的是領(lǐng)域?qū)ο?/strong>。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末管嬉,一起剝皮案震驚了整個濱河市皂林,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚯撩,老刑警劉巖础倍,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胎挎,居然都是意外死亡沟启,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門犹菇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來德迹,“玉大人,你說我怎么就攤上這事揭芍「旄悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵称杨,是天一觀的道長肌毅。 經(jīng)常有香客問我,道長姑原,這世上最難降的妖魔是什么悬而? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮锭汛,結(jié)果婚禮上笨奠,老公的妹妹穿的比我還像新娘。我一直安慰自己唤殴,他們只是感情好般婆,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朵逝,像睡著了一般腺兴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廉侧,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天页响,我揣著相機與錄音,去河邊找鬼段誊。 笑死闰蚕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的连舍。 我是一名探鬼主播没陡,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盼玄?” 一聲冷哼從身側(cè)響起贴彼,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埃儿,沒想到半個月后器仗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡童番,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年精钮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剃斧。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轨香,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幼东,到底是詐尸還是另有隱情臂容,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布根蟹,位于F島的核電站策橘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏娜亿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一蚌堵、第九天 我趴在偏房一處隱蔽的房頂上張望买决。 院中可真熱鬧,春花似錦吼畏、人聲如沸督赤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躲舌。三九已至,卻和暖如春性雄,著一層夾襖步出監(jiān)牢的瞬間没卸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工秒旋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留约计,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓迁筛,卻偏偏與公主長得像煤蚌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355