c#无法解析类型的服务 [英] c# Unable to resolve service for type

查看:57
本文介绍了c#无法解析类型的服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经为这个错误苦苦挣扎了一段时间,不明白为什么:

I've been struggling with this error for a while , can't understand why :

在尝试激活"Zipcode_Service.Models.ZipcodeContext"时,无法解析类型为"Microsoft.Extensions.Configuration.IConfigurationRoot"的服务.

Unable to resolve service for type 'Microsoft.Extensions.Configuration.IConfigurationRoot' while attempting to activate 'Zipcode_Service.Models.ZipcodeContext'.

我尝试查看所有重新配置连接的地方,一切似乎都很好:

I tried looking at all the places the connection is being reconfigured , all seem fine :

ZipcodeContext:

ZipcodeContext :

   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"]);
    }

ZipcodeController:

ZipcodeController :

public class CityController : Controller
{
    private ILogger<CityController> _logger;
    private IZipcodeRepository _repository;

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

    [HttpGet("{cityName}")]
    public IActionResult GetCities(string cityName)
    {
            var results = _repository.GetCitiesByCityName(cityName);
            return Ok(Mapper.Map<IEnumerable<CityViewModel>>(results));
        }

ZipcodeRepository:

ZipcodeRepository:

public class ZipcodeRepository : IZipcodeRepository
{
    private ZipcodeContext _context;

    public ZipcodeRepository(ZipcodeContext context)
    {
        _context = context;
    }

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

IZipcodeInterface:

IZipcodeInterface:

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

我的创业公司:

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

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(_config.GetSection("Logging"));
        loggerFactory.AddDebug();
        app.UseMvc(config =>
        {
            config.MapRoute(
                name: "Default",
                template: "{controller}/{action}/{id?}",
                defaults: new { controller = "App", action = "Index" }
                );
        }

注意:禁用CityController的构造函数并使用一个空的作品,我猜错误来自 _repository =仓库

Note: disabling the constructor of CityController and using an empty one works, I guess the error comes from the _repository = repository

推荐答案

在您的情况下,您有两种处理选项的方法:

You have two ways to deal with options in your case:

只需注册 IConfigurationRoot :

public void ConfigureServices(IServiceCollection services)
{
   //...
   services.AddSingleton<IConfigurationRoot>(c => Configuration);
   //...
}

推荐的方法是创建特殊的 ZipcodeOptions 类,并使用

Recommended way is to create special ZipcodeOptions class, and register it, using Options pattern:

public void ConfigureServices(IServiceCollection services)
{
   //...
    services.Configure<ZipcodeOptions>(Configuration.GetSection("ZipcodeOptions"));
   //...
}

这篇关于c#无法解析类型的服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆