關於Domain Model

Enterprise Architecture

何謂Domain Model?

Domain Model部分是專門處理領域的概念層,只要跟事物與事物之間的關係存在這個模型。

這裡的事物指的是?

例如:實務上在建構電商系統,這個事物表示購物車、訂單、訂單明細的事物,這些事物又包含了資料,更重要是還有行為。

Domain Model越能表示真實的領域越好,因為可以更容易理解組織中的業務邏輯、規則、驗證過程。

最後Domain Model與Active Record 模式之間差別在於,Domain Model中的業務實體不知道如何持久化自己。

什麼是持久化呢?

將應用程式的資料保存且保留某種形式的儲存中,以便應用程式重新啟動或不同執行時間上保留資料。

領域模型通常包含以下幾個特點:

  1. 實體(Entities): 表示領域中的具體事物,如客戶、訂單、產品等。
  2. 屬性(Attributes): 描述實體的特徵或特性,如客戶的姓名、訂單的日期等。
  3. 關係(Relationships): 描述實體之間的相互關聯,例如一個訂單屬於一個客戶,形成客戶和訂單之間的關係。
  4. 操作(Operations): 描述對實體進行的操作,例如對訂單的新增、修改、刪除等。

領域模型通常會用在UML的呈現,可以顯示系統的結構和行為,有助於團隊間的理解,並提供一個基礎,以便進一步的軟體設計和實現,以下面一個例子來說明Domain Model的基礎應用。

using System;
using System.Collections.Generic;

// 實體類別:產品
public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

// 實體類別:訂單項目
public class OrderItem
{
    public int OrderItemId { get; set; }
    public Product Product { get; set; }
    public int Quantity { get; set; }
    public decimal Subtotal => Quantity * Product.Price;
}

// 實體類別:訂單
public class Order
{
    public int OrderId { get; set; }
    public DateTime OrderDate { get; set; }
    public List<OrderItem> OrderItems { get; set; } = new List<OrderItem>();

    public decimal Total => OrderItems.Sum(item => item.Subtotal);

    public void AddOrderItem(Product product, int quantity)
    {
        var orderItem = new OrderItem
        {
            Product = product,
            Quantity = quantity
        };
        OrderItems.Add(orderItem);
    }
}

class Program
{
    static void Main()
    {
        // 建立產品
        var laptop = new Product
        {
            ProductId = 1,
            Name = "Laptop",
            Price = 999.99m
        };

        var mouse = new Product
        {
            ProductId = 2,
            Name = "Mouse",
            Price = 19.99m
        };

        // 建立訂單
        var order = new Order
        {
            OrderId = 1,
            OrderDate = DateTime.Now
        };

        // 新增訂單項目
        order.AddOrderItem(laptop, 2);
        order.AddOrderItem(mouse, 1);

        // 顯示訂單總金額
        Console.WriteLine($"Order Total: ${order.Total}");
    }
}

上述例子中有三個實體類別:Product、OrderItem、 Order,這個模型就是一個簡易的訂單系統,其中包含產品、訂單項目和訂單等實體類別。

類別都有屬性描述其特徵以及Domain Model的方法來執行操作,以上就是Domain Model的介紹。

元哥的筆記