Business Layer - UI communication Taking the following cases in consideration.
Witch one would you prefer and why?
Suggestions appreciated.


Using Delegates

private void cmdDelete_enterClick(object sender, EventArgs e)
    {               
    var accountManager = new BLAccountManager();
    accountManager.OnAccountInUse = (msg) =&gt; MessageBox.Show(msg);

    accountManager.OnConfirmation = (msg) =&gt;
    {
        var dialogResult = MessageBox.Show(msg);
        return (dialogResult == DialogResult.OK);
    };

    accountManager.DeleteAccount(selectedAccountId);
}




 public class BLAccountManager
 {

public Action&lt;string&gt; OnAccountInUse;
public Func&lt;string, bool&gt; OnConfirmation;


public void DeleteAccount(string accountId)
{
    var bookingsUsingAccount = GetBookingsUsingAccount(accountId);
    if (bookingsUsingAccount.Count &gt; 0)
    {           
        OnAccountInUse("msg");
        return;
    }
    BankAccount account = GetAccount(accountId);
    if (OnConfirmation("confirm"))
    {
        account.Delete(false);
    }
}
}

Using Interfaces

  public interface IUICallback
  {
     void SendMessage(string message,string caption);
         bool Confirmation(string message,string caption);
  }




public class WinFormsUICallback : IUICallback
{
  public void SendMessage(string message, string caption)
  {
    MessageBox.Show(message, caption, MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation);
  }

  public bool Confirmation(string message, string caption)
  {
    DialogResult result = MessageBox.Show(message);
    return result == DialogResult.OK;
  }
}




  private void cmdDelete_Click(object sender, EventArgs e)
  {
        IUICallback uiCallback = new WinFormsUICallback();
    var accountManager = new BLAccountManager(uiCallback);  
    accountManager.Delete(selectedAccountId);
  }




  public void Delete(string accountId)
  {
    BookingList bookingsUsingAccount =     bookingManager.GetBookingsUsingAccount(accountId);
    if (bookingsUsingAccount.Count &gt; 0)
    {       
            _uiCallback.SendMessage(msg, caption);
            return;
    }

    if (_uiCallback.Confirmation(confirmationMessage, caption))
        {
           account.Delete(false);
    }
   }
A third option is to use continuations:

public void DeleteAccount(string accountId, Action&lt;string&gt; OnAccountInUse, Func&lt;string,bool&gt; OnConfirmation)
{
    var bookingsUsingAccount = GetBookingsUsingAccount(accountId);
    if (bookingsUsingAccount.Count &gt; 0)
    {           
        OnAccountInUse("msg");
        return;
    }
    BankAccount account = GetAccount(accountId);
    if (OnConfirmation("confirm"))
    {
        account.Delete(false);
    }
}


edit: adding the usage, similar to the cases in the question

private void cmdDelete_enterClick(object sender, EventArgs e)
{               
    var accountManager = new BLAccountManager();

    Func&lt;string,bool&gt; OnConfirmation = (msg) =&gt;
    {
        var dialogResult = MessageBox.Show(msg);
        return (dialogResult == DialogResult.OK);
    };

    accountManager.DeleteAccount(selectedAccountId,
                                 (msg) =&gt; MessageBox.Show(msg),
                                 OnConfirmation);
}