.NET Core – 尝试将存储库添加到我的API控制器,但是当我执行每个控制器方法时都会返回500错误

正如标题所说。 我正在创建一个Web API,在我的API控制器中,我正在尝试在构造函数中声明一个存储库。 我成功声明了它,但我尝试在该控制器中调用的每个API方法都返回500错误。 当我删除构造函数/存储库变量时,我没有问题。

调节器

[Route("api/[controller]")] public class TestController: Controller { private ITestRepository _testRepository; public TestController(ITestRepository testRepository) { _testRepository= testRepository; } [HttpGet] public IEnumerable Get() { return new string[] { "value1", "value2" }; } } 

Startup.cs

 public void ConfigureServices(IServiceCollection services) { // Add framework services. services .AddMvcCore() .AddJsonFormatters() .AddApiExplorer(); services.AddScoped(); services.AddSwaggerGen(); } 

我错过了什么吗?

简答

我正在尝试在构造函数中声明一个存储库。 我成功声明了它,但我尝试在该控制器中调用的每个API方法都返回500错误。 当我删除构造函数/存储库变量时,我没有问题。

您可能需要进行以下两项更改之一:

  1. 从存储库的构造函数中删除参数,或
  2. 注册存储库构造函数所采用的服务。

说明

您问题中的确切代码适用于以下存储库代码。

 public interface ITestRepository { } public class TestRepository : ITestRepository { } 

但是,如果构造函数接受参数,则代码会抛出500错误。

 public class TestRepository : ITestRepository { public TestRepository(object someObject) { } } 

它抛出了该构造函数,因为对services.AddScoped()的调用要求TestRepository构造函数满足这两个条件之一。

  1. 没有参数的构造函数,或
  2. 采用可解析服务的构造函数。

因此,要修复代码,您需要进行以下两项更改之一:

  1. 从构造函数中删除参数,或
  2. 注册构造函数所使用的服务。

例如,如果存储库在其构造函数中使用DbContext,那么您的代码可能如下所示。

Startup.cs

 public void ConfigureServices(IServiceCollection services) { services.AddMvcCore() .AddJsonFormatters() .AddApiExplorer(); services .AddEntityFramework() .AddInMemoryDatabase() .AddDbContext(); // register a service services.AddScoped(); services.AddSwaggerGen(); } 

TestRepository.cs

 public class TestRepository : ITestRepository { // pass the registered service to the ctor public TestRepository(TestDbContext testDbContext) { } } 

首先,我们使用Microsoft.practices.Unity注册依赖组件,然后我们解决它们在哪里使用它们。

在使用之前,您尚未解决依赖关系。

 public class TestController: Controller { private ITestRepository _testRepository; public TestController(ITestRepository testRepository) { _testRepository= testRepository; } [HttpGet] public IEnumerable Get() { return new string[] { "value1", "value2" }; } } 

在此注册:

 DIContainer.Instance.RegisterType(); 

我们在使用之前解决了依赖关系。

 DIContainer.Instance.Resolve().RetrieveTwitterTags();