c#无法解析类型的服务 [英] c# Unable to resolve service for type
问题描述
我已经为这个错误苦苦挣扎了一段时间,不明白为什么:
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屋!