0

我有一個處理'債券'的財務應用程序。我需要實例化對象 - 多態性

  1. 模型的應用程序,以避免貧血模型(我理解是壞的)。
  2. 根據鍵的類型實例化不同的實現。

系統從外部系統獲取指令,並將指令應用於指定的債券。因此我有一個指令實體

Instruction[Id,BondReference,Action,Value] 

例如,到投票」的指令在債券

Instruction 
{ 
    BondReference: Bond1, 
    Action: Vote 
    Value: VoteYes 
    ResolutionReference: Resolution1 
} 

和債券實體傳遞

Bond 
{ 
    Id: 1, 
    Reference: Bond1 
    Resolutions: [ 
        {Resolution1: We have resolved to increase our stake in Google}, 
        {Resolution2: We have resolved to fire the CEO} 
        ... 
       ] 
    Instructions: [Inst1,Inst2,Inst3...] 
} 

但是一個分辨率的,指令通常不會多隻一件事(它實際上是在一個有效的許多指令),例如取消先前指令的指令,這意味着首先取消先前的交易,然後需要重新計算某些值。而且,單個指令可能會超載,可能會取消先前的指令並投票決定。

我被建議使用域服務來處理新的指令。

BondService 
{ 
    public void Apply(Instruction newInstruction) 
    { 
     var bond = _bondRepository.GetByReference(newInstruction); 
     bond 
      .RecalculateNominalValue(newInstruction) 
      .CalculateInterest(newInstruction) 
      .CancelInstruction(newInstruction) 
      .Approve(newInstruction); 
    } 
} 

我看到這個結構的問題是,對於每條指令,即使方法不相關,也會調用所有方法。我可以使用一些if語句,但代碼看起來不整潔。

現在的問題是,

  1. 這是模擬的最佳方式?
  2. 而對於計算,根據債券類型的不同計算。所以我想實現多態。我被告知我需要使用工廠來實例化正確的實現。這是最好的方法嗎?

對於BondType 1,3,5我使用calculationA,對於bondType 2,7 ...我需要使用計算B.我如何實現不同的計算類型?注意,我對多態性非常熟悉,但是,我一直無法找到如何實例化正確實現的可靠示例。 日Thnx遠遠閱讀本...

回答

2

的一點想法:

  • Instruction好像它提供一個命令DTO的目的和用於存儲的審計線索的值對象。解耦這兩個概念。

  • Bond實體(如財務領域的典型值)需要event sourcing。實際上,通過存儲所有指令和解決方案,您已經在那裏。明確說明。如果您對債券進行明確的域名事件更改,則可能無需存儲所有說明。單個指令可能導致多個事件。

  • 域服務的例子實際上是一個application service或命令處理程序。應用程序服務將存儲庫和委託協調到域對象。要最好地實現應用程序服務,請將盡可能多的業務邏輯委託給域對象,在這種情況下爲Bond。因此,讓Bond實體準確決定要調用哪些子行爲,以便應用程序服務只調用實體上的單個方法。

  • 要提供多態性,請創建一個值對象以允許表示不同的鍵類型。債券實體委託給此多態債券類型值。您可能需要一家工廠來初始化這種債券類型的債券,但一旦它與債券實體相關聯,您就不再需要致電工廠,債券只需引用債券類型的債券。

+0

thanx的響應,有一件事我沒有提到的是,這是一個棕地項目,我們正在慢慢地將其轉換爲新的應用程序,並在此期間,我們將使用現有的前端,因此我們不能改變數據庫結構等,所以我會記住事件採購的建議(但可能(很可能)現在不實施),因爲我必須做一些關於這個話題的閱讀等。我最喜歡的是1 instr =多個事件(我很可能是從1條指令創建多個命令)。我會盡快答覆你的建議 – sawe

+0

我需要工廠的原因是因爲大約3個bondType使用一個計算,而一個bondType使用另一個計算。所以從長遠來看,可以添加bondTypes來完全使用不同的計算,所以* 1 bondType!= 1計算*。所以使用bondType進行計算意味着我在不同的地方複製了計算。說得通?或者我可以進一步解釋 – sawe