系统.类之间的递归依赖导致的StackOverflow异常
本文关键字:StackOverflow 异常 递归 之间 系统 依赖 | 更新日期: 2023-09-27 18:13:38
我在应用程序中使用带有服务层的存储库模式。为了遵循最佳实践,我为每个repo创建了一个服务。
我的两个服务是相互依赖的。我需要从每个服务调用至少一个方法,从另一个服务。
我使用依赖注入来解析这些依赖。问题似乎是由以下原因引起的:
-
A类依赖于B类
-
B类依赖于A类
我的DI容器可以解析上述所有内容。
我调用类a,类B的一个实例被注入…
这会导致容器为类B创建一个新的类a实例....
为类B注入一个新的类a…等等…
我认为这是我的一个基本设计缺陷,但我看不到明显的方法来解决这个问题。
任何想法?
public UserService
{
private readonly IUserRepository userRepo;
private readonly ITransactionService transactionService;
//ctor here....
public ExampleUserMethod()
{
transactionService.GetTransactions();
//do other things
}
public GetUsers()
{
//return users
}
}
public TransactionService
{
private readonly ITransactionRepository transactionRepo;
private readonly IUserService userService;
//ctor here....
public ExampleTransactionMethod()
{
userService.GetUsers();
//Do other things...
}
public GetTransactions()
{
//return transactions
}
}
如果容器有生命周期,则支持循环引用。这样,如果A被请求,它首先被创建并添加到缓存中。然后B被创建,因为它需要作为依赖项并分配给A。因为B需要A的实例,所以A被请求但没有被创建,因为它在缓存中找到并且已经分配了这个现有的实例。
但我建议不要使用这种解决方案。你最好先尝试打破循环引用。循环引用从来都不是一个好主意。例如:
public UserService
{
private readonly IUserRepository userRepo;
private readonly ITransactionStore transactionStore;
//ctor here....
public ExampleUserMethod()
{
transactionStore.GetTransactions();
//do other things
}
public GetUsers()
{
//return users
}
}
public TransactionService
{
private readonly ITransactionStore transactionStore;
private readonly IUserService userService;
//ctor here....
public ExampleTransactionMethod()
{
userService.GetUsers();
//Do other things...
transactionStore.AddTransaction(transaction);
}
}
public class TransactionStore
{
private readonly ITransactionRepository transactionRepo;
public GetTransactions()
{
//return transactions
}
public AddTransaction()
{
//return transactions
}
}
关于DI的知识不多,从我的理解来看,用哪种技术建模循环依赖关系并不重要;这样做总是错误的,无论它是如何实现的。
如果你不使用DI,你的编译器会通知你;现在,由于您将它重新定位到运行时,因此稍后会发生错误,并且运行时会通知您。
所以我的建议是去掉这个循环依赖。
对我来说,解决这个问题的明显方法似乎是将类A和B需要的所有东西移到类C中,并让类A和B都引用(或被注入)类C
但是如果没有一个具体的例子来说明你想要做什么,很难说