0

我試圖使用事件作爲一個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動作)。觸發事件將簡單地將控制流從操作改變爲事件處理程序。

那麼接下來你將如何使用事件在這種情況下?

回答

0

,那麼你將如何在這種情況下使用的事件?

簡短的回答是:你不會:)

你在哪裏,你有一把錘子,你正在尋找一個釘子的情況。而是確定爲什麼你需要這樣做。

通常你會知道什麼時候什麼東西在域本身發生的域內很少使用。你可以看看域名事件。但是再一次,一個特定的域可能會對另一個域中發生的事情更感興趣。

如果你發現你自己需要在網絡服務器上知道一個員工被添加,然後我會去與域名事件無論如何。域事件通常用於在其他系統訂閱的服務總線上發佈事件。例如,一旦您在人力資源系統中添加員工,訪問控制系統就想知道,以便它可以開始髮卡。在這種情況下,訪問控制系統將使其端點訂閱Company.HR.Messages.EmployeeAddedEvent消息。

相關問題