中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

DDD~領域層

回到目錄

再論Domain與Infrastructure

在面向領域的設計中,領域層(Domain)實現上是位于最底層的,其它層有對它的引用,包括基礎設施層(Infrastructure)也是去引用領域層的,我認為,這是對的,事實上,在Domain中會規定如何去進行數據持久化的操作,包括方法名,方法簽名等等,而采用哪種架構去實現這種持久化的方法則是Infrastructure層需要做的,這種設計絕對是把領域,業務放在第一位的,完全符合Eric 的DDD。

Domain.Core Layer & Domain Layer

我們在進行軟件設計時,一個(ge)習慣(guan)就(jiu)是把(ba)僅(jin)供代碼抽(chou)象出來(lai),這(zhe)是對(dui)的(de)(de),也是符合標準(zhun)的(de)(de),對(dui)于(yu)domain層(ceng)我們會把(ba)與(yu)具體領域無(wu)關(guan)的(de)(de)代碼抽(chou)象成一個(ge)domain.core,這(zhe)個(ge)項(xiang)目位于(yu)整個(ge)DDD解(jie)決方案的(de)(de)最底(di)層(ceng),而具體的(de)(de)domain則會引入它,看一下我們的(de)(de)DDD中的(de)(de)domain層(ceng)

domain.core中有數(shu)據持久化的規范,規約實現Specification及一些(xie)公用的功能代碼(ma)。

具體(ti)的(de)domain項目中包括(kuo)三(san)部(bu)(bu)分內容,具體(ti)業(ye)務規(gui)范(fan)(如產品(pin)業(ye)務規(gui)范(fan)Products),數據模型(xing)POCO實體(ti),用于網絡(luo)傳輸的(de)DTO實體(ti)(這部(bu)(bu)分可以單(dan)拿(na)出來,本例直(zhi)接(jie)放在了(le)實體(ti)層(ceng)),我們(men)先來看一下products這個業(ye)務規(gui)范(fan):

IProductRepository:它是產品實體的數據持久化規范,Infrastructure層會去實現它,這里不會關心Infrastructure是采用linq to sql還是ef,我只規定要做什么,至少怎么去做,由Infrastructure自己去決定!

  public interface IProductRepository : IExtensionRepository<Product>
    {
        /// <summary>
        /// 獲取產(chan)品(pin)列表(biao)
        /// </summary>
        /// <returns></returns>
        IQueryable<Product> GetProduct();

        /// <summary>
        /// 建立產品
        /// </summary>
        void AddProduct(Product entity);

        /// <summary>
        /// 修改(gai)產品
        /// </summary>
        void ModifyProduct(System.Linq.Expressions.Expression<Action<Product>> entity);
    }

ProductSpecification:這是一個與業務息息相關的規約類,它會根據具體業務去設計每一個業務的具體規約
 

  /// <summary>
    /// 通過用戶信息得(de)到他的訂單列表
    /// </summary>
    public class ProductSpecification : Specification<Product>
    {
        string _productName = default(string);
        public ProductSpecification(string productName)
        {
            _productName = productName;
        }
        public override Expression<Func<Product, bool>> SatisfiedBy()
        {
            Specification<Product> spec = new TrueSpecification<Product>();
            if (string.IsNullOrWhiteSpace(_productName))
                spec &= new DirectSpecification<Product>(o => o.ProductName.Contains(_productName));
            return spec.SatisfiedBy();
        }
    }

網絡傳輸(shu)對(dui)象DTO,它是在進(jin)行WEB通訊時為了減少網站負載,而(er)提出的(de)新的(de)實(shi)體層,將與(yu)本服(fu)(fu)務(wu)(wu)有關(guan)的(de)實(shi)體屬性提出,形成一(yi)個新的(de)實(shi)體,這在SOA服(fu)(fu)務(wu)(wu)

中用的比較多。

  [DataContract]
    public class ProductDTO
    {
        [DataMember]
        [DisplayName("商(shang)品ID")]
        public int ProductID { get; set; }
        [DataMember]
        [DisplayName("商品名(ming)稱")]
        public string ProductName { get; set; }
        [DataMember]
        [DisplayName("建立日期(qi)")]
        public System.DateTime CreateDate { get; set; }
        [DataMember]
        public int SaleCount { get; set; }
        [DataMember]
        public Nullable<int> ClickCount { get; set; }
        [DataMember]
        [DisplayName("產品描述")]
        public string Info { get; set; }
        [DataMember]
        public int UserID { get; set; }
        [DataMember]
        [DisplayName("銷售價格(ge)")]
        public decimal SalePrice { get; set; }
        [DataMember]
        [DisplayName("折(zhe)扣")]
        public int Discount { get; set; }
    }

數據模(mo)型EDMX,這種(zhong)模(mo)塊(kuai)我(wo)(wo)們稱為entity frameworks模(mo)型,也叫EF模(mo)型,它(ta)可以把物理數據庫映射到EDMX文件(jian)中(zhong),它(ta)是以XML形(xing)式保存的,而我(wo)(wo)們

的POCO簡單(dan)數據(ju)實體也可以由工具自動生成,這些實體與原(yuan)始數據(ju)表一(yi)一(yi)對應。ef poco 模型實體采用partial class方便(bian)開發人員以后對實體類進行擴展。

  public partial class Product
    {
        public Product()
        {
            this.ProductDetail = new HashSet<ProductDetail>();
        }
    
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public System.DateTime CreateDate { get; set; }
        public int SaleCount { get; set; }
        public Nullable<int> ClickCount { get; set; }
        public string Info { get; set; }
        public int UserID { get; set; }
        public decimal SalePrice { get; set; }
        public int Discount { get; set; }
        public System.DateTime UpdateDate { get; set; }
    
        public virtual User_Info User_Info { get; set; }
        public virtual ICollection<ProductDetail> ProductDetail { get; set; }
    }

最后,我們看一個domain與Infrastructure之間的數據通信,它們一般使用IOC容器進行實現,像AutofacUnity都是不錯的選擇,而unity是一個強大的工具

集,它不僅包(bao)括IOC的功能,而(er)且還提供(gong)了(le)對AOP的實現!下(xia)次我們將著重介紹一(yi)下(xia)Unity在DDD中的使用,介請期待!

 

回到目錄

posted @ 2013-09-16 13:42  張占嶺  閱讀(7653)  評論(0)    收藏  舉報