尝试激活时无法解析服务类型
Posted
技术标签:
【中文标题】尝试激活时无法解析服务类型【英文标题】:Unable to resolve service for type while attempting to activate 【发布时间】:2018-04-06 09:44:27 【问题描述】:在我的 ASP.NET Core 应用程序中,我收到以下错误:
InvalidOperationException:尝试激活“Cities.Controllers.HomeController”时无法解析“Cities.Models.IRepository”类型的服务。
我是 HomeController
我正在尝试将 Cities
getter 传递给视图,如下所示:
public class HomeController : Controller
private readonly IRepository repository;
public HomeController(IRepository repo) => repository = repo;
public IActionResult Index() => View(repository.Cities);
我有一个文件Repository.cs
,其中包含一个接口及其实现,如下所示:
public interface IRepository
IEnumerable<City> Cities get;
void AddCity(City newCity);
public class MemoryRepository : IRepository
private readonly List<City> cities = new List<City>();
public IEnumerable<City> Cities => cities;
public void AddCity(City newCity) => cities.Add(newCity);
我的Startup
类包含模板中默认生成的代码。我做了任何更改:
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
public void ConfigureServices(IServiceCollection services)
services.AddControllersWithViews();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
...
【问题讨论】:
【参考方案1】:要让依赖注入框架解析IRepository
,它必须首先向容器注册。例如,在ConfigureServices
中,添加以下内容:
services.AddScoped<IRepository, MemoryRepository>();
对于默认使用 new hosting model 的 .NET 6+,请在 Program.cs 中添加以下内容:
builder.Services.AddScoped<IRepository, MemoryRepository>();
AddScoped
只是service lifetime 的一个例子:
对于 Web 应用程序,范围生命周期表示每个客户端请求(连接)创建一次服务。
有关 ASP.NET Core 中的依赖注入的更多信息,请参阅docs。
【讨论】:
【参考方案2】:我们在实体框架工作核心数据库优先方法中遇到此错误。我按照以下步骤解决了错误enter code here
第 1 步:检查您的上下文类构造函数应该是这样的
public partial class ZPHSContext : DbContext
public ZPHSContext(DbContextOptions<ZPHSContext> dbContextOptions)
: base(dbContextOptions)
第 2 步:在启动文件中
public void ConfigureServices(IServiceCollection services)
services.AddMvc();
services.AddDbContext<ZPHSContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("BloggingDatabase")));
第 3 步:appsettings 中的连接字符串
"ConnectionStrings":
"BloggingDatabase": "Server=****;Database=ZPHSS;Trusted_Connection=True;"
第 4 步:删除上下文类中 OnConfiguring 方法中的默认代码
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
【讨论】:
【参考方案3】:其他答案是正确的,但是我正在启动一个新的 asp.net core 2.1.x 项目并收到此错误。
最后被我打错了。
所以在我的控制器中而不是正确使用这样的界面
public HomeController(IApplicationRepository applicationRepository)
_applicationRepository = applicationRepository;
我的错字让我使用ApplicationRepository
而不是它的界面IApplicationRepository
请注意下面,因此没有错误发现丢失的“我”很有趣:/
public HomeController(IApplicationRepository applicationRepository)
_applicationRepository = applicationRepository;
因此控制器没有解析 DI...
【讨论】:
我……我不敢相信这是我的问题。正是我的问题。好痛苦……谢谢! 不行!这也是我的问题!【参考方案4】:这样的方法需要添加到您的Startup
:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
//...
// Add application services.
services.AddTransient<IRepository, MemoryRepository>();
//..
服务应在使用前注册。
更新:
如果您不想在应用程序中使用 DI,只需在 HomeController
的构造函数上创建 MemoryRepository
的实例,如下所示:
public class HomeController : Controller
private IRepository repository;
public HomeController()
repository = new MemoryRepository();
public IActionResult Index()
return View(repository.Cities);
【讨论】:
如何在不使用 DI 的情况下修改我现有的代码?【参考方案5】:您必须将您的实现添加到 DI(依赖注入)部分。对于 .Net Core Mvc,应该是这样的:
public void ConfigureServices(IServiceCollection services)
services.AddDbContext<ApplicationDbContext>(options =>
options.UseInMemoryDatabase()
);
services.AddScoped<IRepository, MemoRepostory>();
【讨论】:
【参考方案6】:这可能对您的代码示例没有帮助,但在我的情况下,同样的错误是循环依赖的结果。
【讨论】:
【参考方案7】:你必须像这样注册你的存储库
services.AddSingleton<IRepository, MemoryRepository>();
【讨论】:
以上是关于尝试激活时无法解析服务类型的主要内容,如果未能解决你的问题,请参考以下文章
InvalidOperationException:尝试激活“DocumentController”时无法解析“IDocumentService”类型的服务
尝试激活“AspNetCoreRateLimit.IpRateLimitMiddleware”时无法解析“AspNetCoreRateLimit.IProcessingStrategy”类型的服务
尝试激活“MyService”时无法解析“System.String”类型的服务
尝试激活“AuthenticateController”时无法解析“Microsoft.AspNetCore.Identity.UserManager”类型的服务
尝试激活服务时无法解析类型“System.Lazy`1[System.Net.Http.IHttpClientFactory]”的服务