ASP.NET依赖注入激活工具错误:无法解析PopularMoviesController服务
修复方案
问题根源
- 循环依赖:
PopularMoviesController构造函数中注入了自身,导致DI容器无法解析服务 - 缺失服务注册:未在DI容器中注册
IHttpClientFactory和电影数据获取服务 - 架构不合理:直接在
HomeController中注入Controller,违反分层架构原则(Controller应处理HTTP请求,而非作为服务被依赖)
步骤1:重构电影数据服务(抽离接口与实现)
首先创建服务接口,将业务逻辑与Controller解耦:
// CineMagicAPI/Services/IPopularMoviesService.cs namespace CineMagicAPI.Services { public interface IPopularMoviesService { Task<List<Movies>> GetPopularMoviesAsync(); } }
实现该服务:
// CineMagicAPI/Services/PopularMoviesService.cs using System.Collections.Generic; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using CineMagicAPI.Models; namespace CineMagicAPI.Services { public class PopularMoviesService : IPopularMoviesService { private readonly IHttpClientFactory _clientFactory; private const string TMDB_API_KEY = "30b4c1980f6c33f5036366f3c4def27b"; public PopularMoviesService(IHttpClientFactory clientFactory) { _clientFactory = clientFactory; } public async Task<List<Movies>> GetPopularMoviesAsync() { var popularMovies = new List<Movies>(); var endpoint = $"https://api.themoviedb.org/3/movie/popular?api_key={TMDB_API_KEY}"; var client = _clientFactory.CreateClient(); var response = await client.GetAsync(endpoint); if (response.IsSuccessStatusCode) { var json = await response.Content.ReadAsStringAsync(); var data = JsonSerializer.Deserialize<TMDbResponse>(json); popularMovies = data?.results ?? new List<Movies>(); } return popularMovies; } private class TMDbResponse { public List<Movies> results { get; set; } } } }
步骤2:修改PopularMoviesController
让Controller依赖服务接口,移除循环依赖:
// CineMagicAPI/Controllers/PopularMoviesController.cs using Microsoft.AspNetCore.Mvc; using CineMagicAPI.Models; using CineMagicAPI.Services; using System.Collections.Generic; using System.Threading.Tasks; namespace CineMagicAPI.Controllers { [ApiController] [Route("[controller]")] public class PopularMoviesController : ControllerBase { private readonly IPopularMoviesService _moviesService; public PopularMoviesController(IPopularMoviesService moviesService) { _moviesService = moviesService; } [HttpGet] public async Task<List<Movies>> GetPopularMoviesAsync() { return await _moviesService.GetPopularMoviesAsync(); } } }
步骤3:修改HomeController
注入服务接口而非Controller:
// CineMagic/Controllers/HomeController.cs using CineMagic.Models; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; using CineMagicAPI.Services; using CineMagicAPI.Models; namespace CineMagic.Controllers { public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly IPopularMoviesService _popularMoviesService; public HomeController(ILogger<HomeController> logger, IPopularMoviesService popularMoviesService) { _logger = logger; _popularMoviesService = popularMoviesService; } public async Task<IActionResult> Index() { var popularMovies = await _popularMoviesService.GetPopularMoviesAsync(); return View(popularMovies); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } } }
步骤4:注册服务到DI容器
修改Program.cs,添加必要的服务注册:
// CineMagic/Program.cs using CineMagicAPI.Services; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); // 注册HttpClient工厂 builder.Services.AddHttpClient(); // 注册电影数据服务 builder.Services.AddScoped<IPopularMoviesService, PopularMoviesService>(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
关键说明
- 移除
PopularMoviesController的自注入,解决循环依赖问题 - 通过
AddHttpClient()注册HttpClient工厂,满足API请求需求 - 采用接口+实现的服务模式,符合依赖倒置原则,代码更易维护和测试
- 避免Controller之间的直接依赖,回归分层架构的职责划分
内容的提问来源于stack exchange,提问作者pythonlover12
相关产品推荐
相关产品推荐

