无法使用存储库 - Microsoft.Extensions.DependencyInjection.Abstractions.dll错误

时间:2016-05-10 10:53:30

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

我正在使用

创建一个简单的Api
"frameworks": {
  "dnx451": { },
  "dnxcore50": { }   
}

我构建了一个非常简单的存储库/接口。当我运行它时,我在VS2015输出中得到以下错误:

  

抛出异常:'System.InvalidOperationException'   Microsoft.Extensions.DependencyInjection.Abstractions.dll异常   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:mscorlib.dll异常中的'System.InvalidOperationException'   抛出:'System.InvalidOperationException'中   抛出Microsoft.AspNet.Hosting.dll异常:   mscorlib.dll中的“System.InvalidOperationException”

异常错误是:

  

InvalidOperationException:无法解析类型的服务   尝试激活时'AwsApi.Models.Repository'   'AwsApi.Controllers.DataController'。

我在事件查看器中获取此信息:

  

来自源HttpPlatformHandler的事件ID 1001的描述   无法找到。引发此事件的组件不是   安装在本地计算机上或安装已损坏。您   可以在本地计算机上安装或修复组件。

我从依赖项和Startup中取出了HttpPlatformHandler,看看它是否有所作为,但它没有。

这是我的project.json文件:

{
  "version": "1.0.0-*",
  "compilationOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "AutoMapper": "4.2.1",
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.Core": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final"

  },

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel",
    "ef": "EntityFramework.Commands"
  },

  "frameworks": {
    "dnx451": { },
    "dnxcore50": { }
  },

  "exclude": [
    "wwwroot",
    "node_modules"
  ],
  "publishExclude": [
    "**.user",
    "**.vspscc"
  ]
}

这是我的存储库代码:

using System.Collections.Generic;
using System.Linq;

namespace AwsApi.Models
{
    public class Repository : IRepository
    {
        private MyContext _context;

        public Repository(MyContext context)
        {
            _context = context;
        }

        public IEnumerable<tblQuotes>  GetAllQuotes()
        {
            return _context.tblQuotes.Take(10).ToList();
        }
    }
}

这是界面:

using System.Collections.Generic;

namespace AwsApi.Models
{
    public interface IRepository
    {
        IEnumerable<tblQuotes> GetAllQuotes();
    }
}

这是控制器:

namespace AwsApi.Controllers
{
    [Route("api/[controller]")]
    public class DataController : Controller
    {
        private IRepository _repository;

        public DataController(Repository repository)
        {
            _repository = repository;
        }

        [HttpGet]
        public JsonResult Get()
        {
            return Json(_repository.GetAllQuotes());
        }
    }
}

我的Startup.cs有:

services.AddScoped<IRepository, Repository>();

如果我更改控制器直接调用上下文并绕过存储库,如下所示:

using Microsoft.AspNet.Mvc;
using AwsApi.Models;
using System.Linq;

namespace AwsApi.Controllers
{
    [Route("api/[controller]")]
    public class DataController : Controller
    {
        private MyContext _context;

        public DataController(MyContext context)
        {
            _context = context;
        }

        [HttpGet]
        public JsonResult Get()
        {
            return Json(_context.tblBinQuotes.Take(10).ToList());
        }
    }
}

它可以工作并返回JSON数据!

当它出错时,它甚至不会触及存储库或控制器。我无法找到它失败的地方。

我正在连接到现有的SQL Db。我已经尝试过,有没有Mapper。

我错过了什么吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您在IRepository注册了Startup.cs,但在控制器中请求Repository。将控制器构造函数参数类型更改为IRepository

public DataController(IRepository repository) {...}