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消息。

相关问题