Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类之间递归依赖的System.StackOverflow异常_C#_.net_Dependency Injection - Fatal编程技术网

C# 类之间递归依赖的System.StackOverflow异常

C# 类之间递归依赖的System.StackOverflow异常,c#,.net,dependency-injection,C#,.net,Dependency Injection,我在应用程序中使用带有服务层的存储库模式。为了遵循最佳实践,我正在为每个回购创建一个服务 我的两项服务相互依赖。我需要从每个服务调用至少一个方法,从另一个服务调用 我正在使用依赖项注入来解决这些依赖项。问题似乎来自以下方面: A类依赖于B类 B类依赖于A类 我的DI容器解决了上述所有问题 我给a类打了个电话,B类的一个实例被注入 这会导致容器为类B创建类a的新实例 这又为B类注入了一个新的a类…等等 我认为这是我的一个基本设计缺陷,但我看不到明显的方法来解决这个问题 有什么想法吗 示例 pu

我在应用程序中使用带有服务层的存储库模式。为了遵循最佳实践,我正在为每个回购创建一个服务

我的两项服务相互依赖。我需要从每个服务调用至少一个方法,从另一个服务调用

我正在使用依赖项注入来解决这些依赖项。问题似乎来自以下方面:

  • 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
    }

}

我对DI知之甚少,据我所知,使用哪种技术对循环依赖进行建模并不重要;无论如何实施,这样做总是错误的

如果您不使用DI,编译器会通知您;现在,由于要将其重新定位到运行时,因此稍后会发生错误,运行时会通知您


所以我的建议是删除这个循环依赖

对我来说,解决这个问题的一个显而易见的方法似乎是将A类和B类都需要的所有东西转移到C类,让A类和B类都引用(或注入)C类


但是如果没有一个具体的例子来说明您要做什么,很难说一些容器支持循环引用,如果它们有生命周期的话。这样,如果ir请求,将首先创建并添加到缓存中。然后创建B,因为它需要作为依赖项并分配给A。因为B需要A的实例,所以会请求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
    }
}

由于没有显示代码,因此没有需要修复的内容。祝你好运!哦,脱口而出显而易见的一点:创建实例的时间太紧了。“other”容器的实例化至少应该足够慢,不会触发无限循环。就像我说的,使用代码可能会更有帮助听起来像是一个糟糕的设计。DI将为您做的一件事是实施一些更好的设计。正如其他人所说,需要一些代码示例编译器的可能副本不会警告类之间的此类依赖关系
class-Foo{Bar;}class-Bar{Foo-Foo;}
就编译器而言是完美的。@AnthonyPegram我读到的“依赖”是“派生自”(即“是一个”,而不是“有一个”)。这是一个错误的假设吗?我会说这个假设非常错误。当谈论依赖关系时,特别是在DI的上下文中,我们谈论的是组合,而不是继承。