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

时间:2017-10-04 20:23:33

标签: c# design-patterns domain-driven-design

我正在构建一个财务应用程序,我有两种方法来计算信用余额 所以我尝试遵循基于领域驱动设计的设计,我觉得有些困惑的方面,我必须在信用实体中注入平衡计算器。 我尝试在信用卡中插入一个名为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);
    }
}

但我觉得这种方式不太好

某人可以澄清我是正确的还是存在更好的方式

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

为什么需要注入服务?

只需将其作为方法的参数传递。

然后,您可以在应用程序级别的应用程序服务中连接整个文件!

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