2012-04-12 85 views
3

我試圖將我的業務邏輯從我的服務類和我的控制器中移出,並將其放入我的業務類中。如何避免貧血域並避免將您的數據訪問類放入您的域類中?

public interface IFoo{ 
    IBar CreateBar(creationParameters); 
} 
public class FirstFoo : IFoo{ 
    IBar CreateBar(creationParameters){ 
    return new FirstBar(creationParameter.Id); 
    } 
} 
public interface IBar{ 
    void DoSomething(); 
} 
public class FirstBar : IBar{ 
    FirstBar(int id){...} 
    void DoSomething(){ 
    //well... do something 
    } 
} 
public class SecondBar : IBar{ 
    FirstBar(int id){...} 
    void DoSomething(){ 
    //well... do something else 
    } 
} 

讓我們想象一下,我需要建立一個SecondFoo這將需要對數據庫的訪問就知道它必須創建一個FirstBar或SecondBar,我該怎麼辦呢?我將數據源注入到SecondFoo的構造函數中?服務定位器?我將createBar移出IFoo?

編輯:我不是在尋找工廠模式的定義,createBar方法可能是像「changeBar」或「doBusinessWithBar」。

回答

2

讓我們想象一下,我需要創建一個SecondFoo那將需要訪問數據庫,知道它必須創建一個FirstBar或SecondBar

看來SecondFoo需要某種決策邏輯的決定是創建一個FirstBar還是一個SecondBar。該邏輯可以在策略接口中被分解出來,其中數據庫訪問實現將在生產中使用。你可以通過構造函數注入策略。

IBar CreateBar(creationParameters) { 
    if (strategy.ShouldCreateFirst(creationParameters)) { 
    return new FirstBar(creationParameter.Id);  
    } 
    else { 
    return new SecondBar(creationParameter.Id);  
    } 
} 
+0

這看起來很好,但如果我們濫用這種模式,我們將最終得到一個anemyc域模型嗎? – 2012-04-13 07:08:32

+0

嗯,不一定。理想情況下,策略是該域的一部分,如[本示例]中的TaxEligibilityCheck(http://codecrafter.blogspot.ca/2012/03/some-oo-design.html)。 – 2012-04-13 09:57:27