0

我想在我的項目中應用領域驅動設計原則,但無法確定我應該如何處理依賴模型的業務邏輯。把複雜的,多領域相關的邏輯:在服務層或模型本身?

例如,假設此場景:
我有PersonCar域模型。每個人都適合從基於年齡/預算/偏好等的數據庫購買某些汽車。在我的模型中,我希望有一個適合此人使用的汽車列表(SuitableCars)。

public class Person 
{ 
    public List<Car> SuitableCars {get; set;} 
} 

但爲了做到這一點,現在,我已經調用一個服務方法(GetSuitableCarsForPerson)從資料庫(含倉庫DI)中獲取數據,運行我的(有時是相當複雜的多型號而定)的自定義邏輯並獲得汽車。

public class PersonService : IPersonService 
{ 
    private IRepository _repo; 

    public PersonService(IPRepository repository) 
    { 
     _repo = repository; 
    } 

    public List<Car> GetSuitableCarsForPerson(Person person) 
    { 
     // business goes here right now. 
    } 

} 

所以SuitableCars屬性的聲明將成爲:

private IPersonService _personService; 
public List<Car> SuitableCars 
{ 
    get 
    { 
     // I have to inject a PersonService in my model. Bad practice? 
     return _personService.GetSuitableCarsForPerson(this); 
    } 
} 

據我所知,服務應保持薄(ref),並用來讓你把不收的DomainModel相關業務在其中。但我相信我所描述的邏輯屬於模型本身。

那麼,如何處理這些類型的邏輯,我應該訪問相關模型並執行各種自定義驗證/過濾器以獲取適當的數據?
謝謝。

回答

0

看起來好像一套人適用的汽車的定義取決於人的模型以外的因素,並且可以獨立於人而變化。這套適合的汽車不僅取決於人的喜好,還取決於所有汽車的組合。該組汽車獨立於人而變化,因此針對給定人的適合的汽車組是確定適合的汽車組的操作的緩存。這些觀察結果表明,存儲庫或域服務應該爲一個人返回一組合適的汽車,並且人與該組合適的汽車之間的關聯不應該直接在人員模型上表達。什麼可能是一個適當的關聯,直接表達人的模型是一組車被人指定爲優先模型,因爲在這種情況下,人是這個數據的「所有者」。在DDD中,直接在模型中或通過使用存儲庫來表達關聯是可以接受的,並且選擇具體的方法取決於幾個因素,其中一些因素如上所述。請看this series of articles深入瞭解如何設計模型。