【发布时间】: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