尝试激活时无法解析类型服务

时间:2017-10-25 10:33:16

标签: c# asp.net-core asp.net-core-mvc

我有一个文件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'。

7 个答案:

答案 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>();