我正在尝试使用事件作为3层应用程序中层之间的通信形式,因为建议使用事件来避免层之间的耦合。然而,当结果中需要同步响应时,我不知道如何使用事件,就像MVC web应用程序的情况一样。考虑以下示例
//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_EmployeAdded_To_Repository",以通知存储库中的添加完成。在业务层中,我定义了处理此事件的事件处理程序"OnEmployeeAddedToRepository"。"OnEmployeeAddedToRepository"事件处理程序依次触发事件"event_EmployeAdded_To_Entity"。最后,在表示层中,我定义了用于处理业务层事件的事件处理程序"OnEmployeeAddedToEntity"。
但在控制器中,我有一个操作"Add",它需要同步返回一个响应(在"AddEmployee"完成后)来通知用户(或者可能调用另一个ajax操作)。触发事件只会更改从操作到事件处理程序的控制流。
那么,在这种情况下,您将如何使用事件呢?
那么,在这种情况下,您将如何使用事件呢?
简短的回答是:你不会:)
你的处境是,你有一把锤子,却在寻找钉子。相反,请确定为什么需要这样做。
通常情况下,你在一个领域内几乎没有什么用处来知道什么时候领域本身发生了什么。您可以查看域事件。但再一次,一个特定的领域可能会对另一个领域发生的事情更感兴趣。
如果你确实发现自己需要在网络服务器上知道添加了一名员工,那么我无论如何都会处理域事件。域事件通常用于在其他系统订阅的服务总线上发布事件。例如,一旦你在人力资源系统中添加了一名员工,访问控制系统就会想知道,以便开始发卡。在这种情况下,访问控制系统将使其端点订阅Company.HR.Messages.EmployeeAddedEvent
消息。