2017-10-04 8 views
0

私はクレジットの残高を計算する2つの方法を持っています。 ドメインドリブンデザインに基づいた設計に従おうとしています。バランス計算機クレジット・エンティティでは 私は信用方法CalculateBalanceAtDateを呼び出すとき、これはこれは例私はどのようにサービスドメインの注入を処理する必要がありますか?

credit { 
    protected IBalanceCalcultar _calculator; 
    .... 
    private void _InitializeBalanceCalculator() 
    { 
     if (_balanceCalculator == null) 
      switch (InterestType) 
      { 
       case EInterestType.OutstandingBalance: 
        _balanceCalculator = new OutstandingBalanceService(); 
        break; 
       case EInterestType.GlobalBalance: 
        _balanceCalculator = new GlobalBalance(); 
        break; 
       default: 
        throw new Exception(); 
      } 
    } 
    public void CalculateBalanceAtDate(DateTime date, bool moratory) 
    { 
     _InitializeBalanceCalculator(); 
     _balanceCalculator.GetBalance(this, date); 
    } 
} 

ですが、私はこの方法はあまり良くないと感じ

を使用しているもののインスタンスを決定IBalanceCalculatorと呼ばれる信用のインターフェイスを挿入しよう

誰かが私を明確にすることができます

答えて

2

誰かが私を明確にすることができ、より良い方法が正しいか良い方法が存在する場合には存在するが正しいかあればあります

あなたのドメインのようなサウンドには、バランスを計算するためにどの戦略を使用するかを決定するInterestPolicyのような概念があります。そのことの名前は自分のドメイン(ドメインの専門家が知っている)であるかを調べる、と

public Balance CalculateBalanceAtDate(
    InterestPolicy interestPolicy, 
    DateTime date, 
    bool moratory) 
{ 
    IBalanceCalculator calculator interestPolicy.balanceCalculator(this.interestType) 
    return calculator.balance(this, date) 
} 

わずかに良いが、式のうち、実体そのものを取ることです引数として渡すと、ちょうど渡します状態

public Balance CalculateBalanceAtDate(
    InterestPolicy interestPolicy, 
    DateTime date, 
    bool moratory) 
{ 
    IBalanceCalculator calculator interestPolicy.balanceCalculator(this.interestType) 
    return calculator.balance(this.creditHistory, date) 
} 
+0

あなたの答えにインスパイアされている私はクラスクレジットのInterestType属性を削除し、その中にInterestPolicyという名前のオブジェクトを配置していると思っています 私のためにInterestPolicyを設定しました。計算されます利子は、信用のライブで変更すべきではありません –

+0

'this.interestType.calculateBalanceAtDate(this.creditHistory、date)'はどうでしょうか? 'InterestType'は適切な計算機で設定された列挙型に過ぎません。 – plalx

+0

yes InterestTypeは列挙型であり、利息の計算方法を決定します InterestTypeはInterestPolicyに属している必要があります。 –

0

あなたがサービスを注入する必要があるのはなぜ?

メソッドのパラメータとして渡してください。

次に、アプリケーションレベルでアプリケーションサービス全体を配線します。

ドメインサービスはパラメータとして完全に問題なく、ドメインオブジェクトも同様にテスト可能になります。

+0

私はバランスの計算機のサービスを注入する必要があると思うそれは複数の場所で使用されているため、例えば、レポートの残高を計算したり、支払いが各メソッドでサービスを渡すという繰り返しタスクを避けるために適用される私は注射サービスを好む使用されています。 –

関連する問題