Ant*_*tti 2 c# dependency-injection asp.net-core
我对 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>();
Run Code Online (Sandbox Code Playgroud)
UserService类中注入了两个服务。这些是那些的构造函数:
public UserService(IUserRepository userRepository, string secret, IAchievementService achievementService)
{
this.achievementService = achievementService;
this.userRepository = userRepository;
this.secret = secret;
}
Run Code Online (Sandbox Code Playgroud)
用户存储库:
public UserRepository(IDatabaseService databaseService)
{
this.databaseService = databaseService;
}
Run Code Online (Sandbox Code Playgroud)
成就服务:
public AchievementService(IAchievementRepository achievementRepository, IUserService userService)
{
this.achievementRepository = achievementRepository;
this.userService = userService;
this.userRequestService = userRequestService;
}
Run Code Online (Sandbox Code Playgroud)
另一个奇怪的事情是,如果我从异常窗口中单击“查看详细信息”(我使用的是 Visual Studio 2019),调试器会崩溃并且不显示任何内容。
看起来您在UserService和之间有循环依赖AchievementService。dotnet 依赖注入不可能在UserService没有AchievementService. 但是要创建 的实例AchievementService,您需要一个 的实例UserService。所以你陷入了无限循环。
您应该尝试通过删除依赖项来避免这种情况。这两个服务真的需要依赖另一个吗?
如果不可能,您可以尝试使用Lazy<Service>而不仅仅是Service.
private readonly Lazy<IAchievementService> lazyAchievementService;
public UserService(Lazy<IAchievementService> lazyAchievementService, /*...*/)
{
this.lazyAchievementService = lazyAchievementService;
// ...
}
public void SomeFunction()
{
var achievementService = lazyAchievementService.Value;
achievementService.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
这应该允许您创建两个类。
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |