我有一个文件Repository.cs
,其中包含一个接口及其实现,如下所示:
public interface IRepository
{
IEnumerable<City> Cities { get; }
void AddCity(City newCity);
}
public class MemoryRepository : IRepository
{
private List<City> cities = new List<City> {
new City { Name = "London", Country = "UK", Population = 8539000},
new City { Name = "New York", Country = "USA", Population = 8406000 },
new City { Name = "San Jose", Country = "USA", Population = 998537 },
new City { Name = "Paris", Country = "France", Population = 2244000 }
};
public IEnumerable<City> Cities => cities;
public void AddCity(City newCity)
{
cities.Add(newCity);
}
}
在HomeController
中,我试图将Cities
吸气剂传递给视图,如下所示:
public class HomeController : Controller
{
private IRepository repository;
public HomeController(IRepository repo)
{
repository = repo;
}
public IActionResult Index()
{
return View(repository.Cities);
}
}
但是我收到了这个错误:
InvalidOperationException:无法解析类型的服务 尝试激活时的“Cities.Models.IRepository” 'Cities.Controllers.HomeController'。
答案 0 :(得分:14)
您需要将IRepository
注册到依赖注入框架中。例如,在ConfigureServices
中,您可以添加:
services.AddScoped<IRepository, MemoryRepository>();
有关ASP.NET Core中的依赖注入的详细信息,请参阅here。
AddScoped
只是一个例子,但却是更常见的方法之一:
每个请求都会创建一次范围生命周期服务。
答案 1 :(得分:2)
我们在实体框架工作核心数据库第一种方法中遇到此错误。我按照以下步骤操作,错误得到解决enter code here
第1步:检查你的上下文类构造函数应该是这样的
public partial class ZPHSContext : DbContext
{
public ZPHSContext(DbContextOptions<ZPHSContext> dbContextOptions):base(dbContextOptions)`enter code here`
{
}
}
第2步:在启动文件中
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddDbContext<ZPHSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}
第3步:appsettings中的连接字符串
"ConnectionStrings": {
"BloggingDatabase": "Server=Server=****;Database=ZPHSS;Trusted_Connection=True;"
}
步骤4:删除上下文类
中OnConfiguring方法中的默认代码protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
答案 2 :(得分:1)
您必须将您的实施添加到DI(Dependeny Injection)部分。对于.Net Core Mvc,它将是这样的:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseInMemoryDatabase()
);
services.AddScoped<IRepository, MemoRepostory>();
}
答案 3 :(得分:1)
这可能对您的代码示例没有帮助,但在我的情况下,相同的错误是循环依赖的结果。
答案 4 :(得分:0)
需要将此类方法添加到Startup
:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//...
// Add application services.
services.AddTransient<IRepository, MemoryRepository>();
//..
}
服务应在使用前注册。
<强>更新强>
如果您不想在应用程序上使用DI,只需在MemoryRepository
的构造函数上创建HomeController
实例,如下所示:
public class HomeController : Controller
{
private IRepository repository;
public HomeController()
{
repository = new MemoryRepository();
}
public IActionResult Index()
{
return View(repository.Cities);
}
}
答案 5 :(得分:0)
其他答案是正确的,但是我正在整理一个新的asp.net core 2.1.x项目并收到此错误。
最终成为我的错字。
因此在我的控制器中,而不是像这样正确使用接口
public HomeController(IApplicationRepository applicationRepository)
{
_applicationRepository = applicationRepository;
}
我的错字让我使用ApplicationRepository
而不是ApplicationRepository
请注意以下内容,因此在没有错误的情况下发现缺失的“ I”很有趣:/
public HomeController(ApplicationRepository applicationRepository)
{
_applicationRepository = applicationRepository;
}
因此,控制器无法解析DI ...
答案 6 :(得分:0)
您必须这样注册您的存储库
services.AddSingleton<IRepository, MemoryRepository>();