我应该如何处理服务域的注入?

问题描述:

我正在建立一个财务应用程序,我有两种方法来计算信用余额 所以我尝试遵循基于域驱动设计的设计,我感到一些困惑的方面如何构成我必须注入余额计算器在信贷实体中。 我尝试插入信贷叫IBalanceCalculator一个接口,然后当我在信贷调用方法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); 
    } 
} 

但我觉得这样不太好

有人能澄清我是正确的,或者如果存在更好的方法

有人能澄清我是正确的,或者如果存在更好的方法

听起来像你的域有一个像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的对象放在里面包含interestType 对于我有意义设置InterestPolicy当我创建信用时,因为方式将计算的利息不应该改变信用的生活 –

+0

那么'this.interestType.calculateBalanceAtDate(this.creditHistory,date)'? 'InterestType'可能只是一个用适当的计算器配置的枚举。 – plalx

+0

是兴趣类型是一个枚举,并确定如何计算利息 我认为更好,而不是信用的属性现在我相信InterestType应该属于InterestPolicy,因为它的实体决定了如何计算利息。 –

为什么你需要注入的服务?

只需将它作为您的方法的参数传递即可。

然后,您将整个应用程序连接到应用程序服务中!

作为参数的域服务非常好,它也使得您的域对象也可以测试。

+0

我认为我应该注入平衡计算器的服务,因为它在多个地方使用,例如,当我计算报告的余额或应用支付时,以避免重复任务在每个方法中传递服务用于我更喜欢​​注射服务。 –