【问题标题】:c# Unable to resolve service for typec#无法解析服务类型
【发布时间】:2017-09-04 19:00:51
【问题描述】:

我一直在为这个错误苦苦挣扎,不明白为什么:

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

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

邮政编码上下文:

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

邮编控制器:

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

邮政编码存储库:

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:

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 = repository

【问题讨论】:

  • 因为你在ZipcodeContext中使用了IConfigurationRoot ,我宁愿推荐你使用Options模式。
  • 为什么重要?在我遵循的教程中,他使用了 IConfigurationRoot 并且那个东西有效。为什么现在不起作用? @YuriyN。
  • 能否请您链接教程?现在不行,因为在内置的 Asp.Net Core 依赖注入容器中,当 DI 面对它时,没有注册服务来解析IConfigurationRoot 接口。
  • 我可以,但它是复数形式,所以除非您有用户,否则您将无法看到它:app.pluralsight.com/…@YuriyN。
  • 那么如何注册服务来解析IConfigurationRoot

标签: c# api asp.net-core


【解决方案1】:

您有两种方法来处理您的案例中的选项:

只需注册IConfigurationRoot:

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

推荐的方法是创建特殊的ZipcodeOptions 类,并使用Options 模式注册它:

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

【讨论】:

    【解决方案2】:

    您可以在ConfigureServices 中拨打services.AddSingleton&lt;IConfigurationRoot&gt;(_config);

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多