最近我问了一个关于软件架构的问题:
在得到答案后,我重新组织和重构了我的应用。简单来说,我的服务互相调用,比如StudentService需要ClassService(例如获取班级平均分数),而ClassService需要StudentService(以获取分配给该班级的学生)。下面是简化后的类:
public class StudentService : IStudentService
{
protected readonly IClassService ClassService;
public StudentService(IClassService classService)
{
ClassService = classService;
}
}
public class ClassService : IClassService
{
protected readonly IStudentService StudentService;
public ClassService(IStudentService studentService)
{
StudentService = studentService;
}
}
.NET Core中的服务是在DI容器中注册的。
services.AddTransient<IStudentService, StudentService>();
services.AddTransient<IClassService, ClassService>();
在解决期间。var studentService = app.ApplicationServices.GetService<IStudentService>();
我收到一个异常,内容为“检测到服务类型的循环依赖关系......”。我理解这里的实现问题,但我不知道如何解决这里的架构问题。你能提供一些建议吗?
编辑:好的,我有一个更加现实的例子,例如员工、服务和公司。
我们有一个带有抽象泛型CRUD库存储库的存储库层。然后我们有派生类:EmployeesRepository ServicesRepository和CompaniesRepository。
EmployeesRepository实现方法:GetTopEmployeesOfTheMonth ServicesRepository实现方法:GetTopServicesForEmployees CompaniesRepository实现方法:GetCompaniesWithTopIncome 在上面的层(称为业务层)中,我们有相同的结构: 抽象泛型CRUD Helper,例如检查用户权限并调用CRUD存储库中的方法。 然后我们有派生的EmployeesHelper、ServicesHerlper和CompaniesHelper。 它们中的所有人都会检查用户权限并从适当的存储库(例如,EmployeesHelper来自EmployeesRepository等)调用方法。 此外,在此层上,我们还有用于创建更多“复杂”对象的方法-由许多实体组成的对象。 例如,CompaniesHelper具有显示销售最多服务的前五家公司的方法。 数据将显示在一个屏幕上,因此它应该通过一个API请求生成并作为JSON返回。 CompaniesHelper的ShowCompaniesWithServices方法调用CompaniesHelper方法和EmployeesHelper方法。 在另一方面,我们有EmployeesHelper,它实现了返回月度最佳员工、他们的最佳服务和所在公司的复杂对象的方法,因此需要Comapnies Helper。
如何解决这种循环依赖关系?是否有设计模式来解决它?