Есть несколько способов сделать это:
1) Выдача исключений с описанием сообщения внутри.
2) Огневые события
3) Использование специальных интерфейсов для взаимодействия с пользователем.
Например, вы можете реализовать нечто вроде интерфейса IUiCallbacks и отправить объект, реализующий этот интерфейс, в класс или метод BLL. Позже, метод в BLL может вызвать IUiCallbacks.SendMessage () или IUiCallbacks.SendError (), чтобы уведомить презентацию. И у вас могут быть разные классы, такие как WinFormsUiCallbacks, WebFormsUiCallbacks и SilentUiCallbacks, реализующие этот интерфейс.
Я обычно использую 1) и 3)
Пример 3) по запросу:
public interface IUiCallbacks
{
void SendMessage(string message);
void SendException(string message, Exception ex);
}
public class WinFormsUiCallbacks : IUiCallbacks
{
public void SendMessage(string message)
{
MessageBox.Show(message);
}
public void SendException(string message, Exception ex)
{
MessageBox.Show(string.Format("Unfortunately, the following errror has occurred:{0}{1}", Environment.NewLine, ex.Message));
}
}
public class OrderService
{
private IUiCallbacks _iUiCallbacks;
...
public OrderService() { ... }
public OrderService(IUiCallbacks iUiCallbacks)
{
_iUiCallbacks = iUiCallbacks;
}
...
public void AddOrder(Order order)
{
...
if(OrderAlreadyExists(order))
{
if(_iUiCallbacks != null)
_iUiCallbacks.SendMessage("The order can not be added, because it is already accepted.");
return;
}
...
}
...
}
Так что его можно использовать так:
public partial class OrderForm : Form
{
...
public void btnAddOrderFromExcel_Click(...)
{
Order order = LoadOrderFromExcel(...);
OrderService orderService = new OrderService(new WinFormsUiCallbacks());
orderService.AddOrder(order);
}
...
}