假设我有一个包含员工和部门的数据库。我创建了一个简单的对象模型来处理这个:
class Employee
{
decimal Salary;
Department Department;
}
class Department
{
decimal TotalSalaries; //calculated as the sum of all employees salaries
//stored in database, not just a C# property
}
和..
class Employees
{
void Create(Employee e);
void Update(Employee e);
void Delete(Employee e);
...
}
class Departments
{
...
}
如果我想更新员工,我会简单地做:
Employee emp = Employees.GetById(1);
emp.Salary += 100; //salary increase
Employees.Update(emp);
我希望每次更新其中一名员工TotalSalaries
时自动重新计算Department
Salary
我可以执行以下操作:
void Update(Employee e)
{
... //
... // sql stuff to update employee fields.
Departments.ReCalculateTotalSalaries(e.Department.Id);
}
但如果我这样做,我认为我违反了单一责任原则。为什么员工更新方法要关心Departments
?这是一个非常简单的例子,但是如果我在实体之间有很多依赖关系,代码可能会变得非常混乱。
我已经考虑过其他方法来做到这一点:
1) 为 Employee 创建一个服务类:EmployeeService
。然后在这个类中,定义一个Update()
更新员工的方法。该方法将更新员工并重新计算部门总数(当然通过调用存储库方法)。
void Update(Employee e)
{
Employees.Update(e);
Departments.ReCalculateTotalSalaries(e.Department.Id);
}
问题:如果我的数据模型中有很多依赖项,我几乎必须将模型层“加倍”(类数 x2)。另外:我如何确定控制器(或视图)将始终调用服务方法,而不是直接调用存储库?
2)在Employees
存储库中有一个事件,从方法OnSalaryChange()
调用。Update()
存储库Departments
将订阅它并在需要时执行必要的操作(换句话说:调用ReCalculateTotalSalaries()
)。那么,属于什么的Departments
留在Departments
,Employees
repository就不用关心其他实体了。
问题:当工资发生变化时(如果有多个订阅者),可能很难理解(通过阅读代码或在调试模式下)发生了什么。如果需要按特定顺序调用订阅者,这也可能成为问题。