如何处理DCI中的异常



假设您有一个处理用户帐户之间转账的上下文。

class Account < ActiveRecord::Base
  belongs_to :user
end
class MoneySender < SimpleDelegator
  class NotEnoughBalanceError < StandardError ; ; end
  def initialize(account)
    super(account)
  end
  def send_money(destination_account, amount)
    raise NotEnoughBalanceError unless can_send?(amount)
    self.transaction do
      self.balance -= amount
      destination_account.balance += amount
    end
    self.balance
  end
  def can_send?(amount)
    self.balance >= amount
  end
end
class HandleMoneyTransferContext
  def initialize(source, destination, amount)
    @source = source
    @destination = destination
    @amount = amount
  end
  def transfer
    sender = MoneySender.new(@source
    sender.send_money(@destination, @amount)
  end
end

转账是由web应用程序触发的,处理这些操作的rails控制器做了这样的事情

class AccountsController < AplicationController
  def transfer
    source = Account.find(params[:id])
    destination = Account.find(params[:destination_account])
    HandleMoneyTransferContext.new(source, destination, params[:amount]).transfer
    render 'success_page'
  rescue MoneySender::NotEnoughBalanceError => e
    flash[:error] = t(accounts.transfer.not_enough_money)
    render 'error_page', status: 400
  end
end

所以我的问题是,是否可以为上下文引发异常?我应该在上下文中捕获角色异常并引发上下文异常吗?(上下文用户不应该知道正在使用哪些角色),是否有更好的解决方案?

谢谢

上下文只是一个对象(是的,有约束,所以不是所有的对象都是上下文),在对象的操作中,一些例外是有序的。例如,如果应该是RolePlayer的是nil,那么ArgumentNil可能是有效的。回答你的问题。因此,如果上下文与上下文封装的系统操作相关,则上下文可以抛出异常。

也就是说,我在你的示例代码中没有看到太多的DCI。例如,在上下文中没有角色方法,看起来实际的行为属于类,而不是角色或对象。在fullo .info网站上有一个转账的例子还有一个栗色宝石的例子。您可以阅读更多关于使用maroon在ruby中执行DCI的内容(尽管自撰写那篇文章和示例以来语法已经简化,但它仍然是一个很好的起点)

相关内容

  • 没有找到相关文章

最新更新