系统.类之间的递归依赖导致的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
    }
}

系统.类之间的递归依赖导致的StackOverflow异常

如果容器有生命周期,则支持循环引用。这样,如果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

但是如果没有一个具体的例子来说明你想要做什么,很难说