我試圖使用事件作爲一個3層應用程序各層之間溝通的一種形式,因爲事件被推薦的方式,以避免層之間的耦合。但是,如果在MVC Web應用程序的情況下需要在結果中使用同步響應,我無法確定如何使用事件。考慮例如如何使用層之間的通信事件在MVC應用程序
//1. Repository for Employee (Database Tier)
interface IEmployeeRepository
{
//event to signal add complete in repository
public event EventHandler event_EmployeeAdded_To_Repository;
void AddEmployee(Employee emp);
}
public class EmployeeRepository: IEmployeeRepository
{
//implementation of event
public event EventHandler event_EmployeeAdded_To_Repository;
public void AddEmployee(Employee emp)
{
//Save to database
//Fire event to signal add complete in repository
event_EmployeeAdded_To_Repository(null,e);
}
}
//2. Business Tier for Employee
interface IEmployee
{
//event to signal add complete in business tier
public event EventHandler event_EmployeeAdded_To_Entity;
public void AddEmployee();
}
public class Employee : IEmployee
{
public event EventHandler event_EmployeeAdded_To_Entity;
IEmployeeRepository _empRepository;
//constructor injection
public Employee(IEmployeeRepository empRepository)
{
this._empRepository = empRepository;
//Add event handler for the repository event
this._empRepository.event_EmployeeAdded_To_Repository += OnEmployeeAddedToRepository;
}
public void AddEmployee()
{
//Call repository method for adding to database
_empRepository.AddEmployee(this);
}
//Event handler for the repository event
public void OnEmployeeAddedToRepository(Object sender, EventArgs e)
{
//Fire event to signal add complete in business tier
event_EmployeeAdded_To_Entity(null, e);
}
}
//3. Presentation Tier
public class EmployeeController : Controller
{
IEmployee _emp;
//constructor injection
public EmployeeController(IEmployee emp)
{
this._emp = emp;
//Add event handler for business tier event
this._emp.event_EmployeeAdded_To_Entity += OnEmployeeAddedToEntity;
}
//This is an Ajax method call
public ActionResult Add()
{
//Call add method of business tier
_emp.AddEmployee();
//What do I do here ?
}
//Event handler for the business tier event
public void OnEmployeeAddedToEntity(Object sender, EventArgs e)
{
//What do I do here ?
}
}
在上面的例子中下面,我已經定義在儲存庫(數據庫層)事件「event_EmployeeAdded_To_Repository」在儲存庫通知加成完成。在業務層中,我定義了處理此事件的事件處理程序「OnEmployeeAddedToRepository」。反過來,「OnEmployeeAddedToRepository」事件處理程序觸發事件「event_EmployeeAdded_To_Entity」。最後,在表示層中,我定義了事件處理程序「OnEmployeeAddedToEntity」來處理業務層事件。
但在控制器中,我有一個動作「添加」,需要同步返回一個響應(在「AddEmployee」完成後)以通知用戶(或者可能調用另一個ajax動作)。觸發事件將簡單地將控制流從操作改變爲事件處理程序。
那麼接下來你將如何使用事件在這種情況下?