0

想象一下,您有一个处理用户账户之间资金转移的上下文。

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

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

谢谢

4

1 回答 1

0

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

也就是说,我在您的示例代码中看不到太多 DCI。例如,上下文中没有角色方法,看起来实际行为属于一个类,既不是角色也不是对象。fulloo.info上有一个汇款示例 以及栗色宝石的示例之一。您可以阅读更多关于在 ruby​​ 中使用 maroon 进行 DCI 的内容(尽管自写那篇文章和示例以来语法已被简化,但它仍然应该是一个很好的起点)

于 2013-06-09T13:22:17.467 回答