【问题标题】:ASP .NET core 3.0 dependency injection throws System.InsufficientExecutionStackExceptionASP .NET core 3.0 依赖注入抛出 System.InsufficientExecutionStackException
【发布时间】:2020-09-13 15:39:48
【问题描述】:

NET 核心依赖注入有一个奇怪的问题。当我尝试注册服务时,会引发 InsufficientExecutionStackException 异常。在这种情况下,这意味着什么?这就是我注册服务的方式(第三行抛出异常):

        var connectionStr = Configuration.GetValue<string>("databaseConnectionString");
        services.AddSingleton<IDatabaseService>(s => new MySqlDatabaseService(connectionStr));
        services.AddSingleton<IUserService>(s => new UserService(s.GetRequiredService<IUserRepository>(), secret, s.GetRequiredService<IAchievementService>()));//this line throws the exception
        services.AddSingleton<IAchievementService, AchievementService>();
        services.AddSingleton<IUserRepository, UserRepository>();
        services.AddSingleton<IAchievementRepository, AchievementRepository>();
        services.AddSingleton<IUserRequestService, UserRequestService>();
        services.AddSingleton<AppSettingsService>();

UserService 类中注入了两个服务。这些是那些的构造函数:

    public UserService(IUserRepository userRepository, string secret, IAchievementService achievementService)
    {
        this.achievementService = achievementService;
        this.userRepository = userRepository;
        this.secret = secret;
    }

用户存储库

    public UserRepository(IDatabaseService databaseService)
    {
        this.databaseService = databaseService;
    }

成就服务

        public AchievementService(IAchievementRepository achievementRepository, IUserService userService)
    {
        this.achievementRepository = achievementRepository;
        this.userService = userService;
        this.userRequestService = userRequestService;
    }

另一个奇怪的事情是,如果我从异常窗口(我使用的是 Visual Studio 2019)中单击“查看详细信息”,调试器就会崩溃并且不显示任何内容。

【问题讨论】:

    标签: c# asp.net-core dependency-injection


    【解决方案1】:

    看起来您在UserServiceAchievementService 之间存在循环依赖关系。如果没有AchievementService 的实例,dotnet 依赖注入就不可能创建UserService 的实例。但是要创建AchievementService 的实例,您需要UserService 的实例。所以你陷入了无限循环。

    您应该尝试通过删除依赖项来避免这种情况。两个服务真的需要依赖另一个服务吗?

    如果不可能,您可以尝试使用Lazy&lt;Service&gt; 而不是只使用Service

    private readonly Lazy<IAchievementService> lazyAchievementService;
    
    public UserService(Lazy<IAchievementService> lazyAchievementService, /*...*/)
    {
        this.lazyAchievementService = lazyAchievementService;
        // ...
    }
    
    public void SomeFunction()
    {
        var achievementService = lazyAchievementService.Value;
        achievementService.DoSomething();
    }
    

    这应该允许您创建两个类。

    【讨论】:

    • 你是对的。我重构了代码,使AchievementsService 类不再需要UserService 类。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2020-11-24
    • 2016-05-22
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多