【问题标题】:C# unable to resolve service for type contextC# 无法解析类型上下文的服务
【发布时间】:2017-09-04 18:29:49
【问题描述】:

我正在使用 API 来实现一些服务。

我收到一个错误:

InvalidOperationException:尝试激活“Zipcode_Service.Controllers.CityController”时无法解析“Zipcode_Service.Models.IZipcodeRepository”类型的服务。

我的控制器的构造函数或_repository的减速导致了这个问题:

    private IZipcodeRepository _repository;
    public CityController(ILogger<CityController> logger, IZipcodeRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

我的界面:

public interface IZipcodeRepository
{
    IEnumerable<City> GetCitiesByCityName(string cityName);
  //  City GetCityNameById(int cityId);
}

我的邮政编码存储库:

public class ZipcodeRepository : IZipcodeRepository
{
    private ZipcodeContext _context;
    private ILogger<ZipcodeRepository> _logger;

    public ZipcodeRepository(ZipcodeContext context, ILogger<ZipcodeRepository> logger)
    {
        _context = context;
        _logger = logger;
    }

    public IEnumerable<City> GetCitiesByCityName(string cityName)
    {
       return _context.Cities.Where(t => t.Name.Contains(cityName)).ToList();
    }

我看到很多类似的问题,他们中的大多数人认为问题出在控制器使用存储库而不是接口上。事实并非如此。

编辑:更多信息
我的启动页面:

  public Startup(IHostingEnvironment env)
    {
        _env = env;
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        _config = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.AddDbContext<ZipcodeContext>();
        services.AddScoped<IZipcodeRepository, ZipcodeRepository>();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
    ...
        app.UseMvc(config =>
        {
            config.MapRoute(
                name: "Default",
                template: "{controller}/{action}/{id?}",
                defaults: new { controller = "App", action = "Index" }
                );

我的上下文类:

    public ZipcodeContext(IConfigurationRoot config, DbContextOptions options) : base(options)
    {
        _config = config;
    }
    public DbSet<City> Cities { get; set; }
    public DbSet<Zipcode> Zipcodes { get; set; }
    public DbSet<Street> Streets { get; set; }


    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        optionsBuilder.UseSqlServer(_config["ConnectionStrings:ZipcodeContextConnection"]);
    }

【问题讨论】:

  • 您是否使用任何特定的 IoC 容器?
  • 我不知道,它是什么 :D @VijayanathViswanathan ?我在 configureServices 中使用 `services.AddScoped();` 如果这就是你的意思。
  • 你能告诉我们你的Startup.cs文件吗?特别是您注册服务的位置。
  • @FedericoDipuma 已编辑,请查看。

标签: c# api asp.net-core dbcontext


【解决方案1】:

当容器试图解析对象图以满足依赖关系时,该问题通常与错误相关。

在 cmets 中你表示你注册了IZipcodeRepository

services.AddScoped<IZipcodeRepository, ZipcodeRepository>();

太好了。但是,在尝试初始化实现 ZipcodeRepository 或其依赖项之一时,也会发生该错误。例如,如果 ZipcodeContext 在初始化时抛出异常,则会导致同样的问题。

确保上下文也配置正确。

例如

services.AddDbContext<ZipcodeContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("ConnectionNameHere"))); 

【讨论】:

  • 我编辑了我的问题并添加了启动页面内容。我已经在上下文类中使用了useSqlServer(),是否需要在 configureServices 中再次使用它?无论如何,即使我尝试使用`services.AddDbContext(options => options.UseSqlServer(_config.GetConnectionString("ZipcodeContextConnection")));`它也没有用..
  • @sagi 应用另一个问题的修复程序与IConfigurationRoot 问题是否有助于解决这个问题?
  • @sagi 否,如果您已经在上下文中拥有它,则无需在启动时执行此操作。根据当时提供的代码我无法判断,所以做了一个假设。
  • 是的,它做到了:) 我会为这项努力投票,因为它可以帮助其他人
  • @sagi 所以它与创建对象图相关的配置问题有关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2022-01-10
  • 2020-03-13
  • 2019-02-10
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多