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

本文关键字:控制器 这样做 方法 错误 返回 存储 添加 NET Core API 我的 | 更新日期: 2024-11-06 19:33:46

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

控制器

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

启动.cs

public void ConfigureServices(IServiceCollection services)
{
   // Add framework services.
   services
      .AddMvcCore()
      .AddJsonFormatters()
      .AddApiExplorer();
   services.AddScoped<ITestRepository , TestRepository >();    
   services.AddSwaggerGen();
}

我错过了什么吗?

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

简答题

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

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

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

解释

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

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

但是,如果构造函数采用参数,则代码会引发 500 错误。

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

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

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

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

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

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

启动.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore()
        .AddJsonFormatters()
        .AddApiExplorer();
    services
        .AddEntityFramework()
        .AddInMemoryDatabase()
        .AddDbContext<TestDbContext>(); // register a service
    services.AddScoped<ITestRepository, TestRepository>();
    services.AddSwaggerGen();
}

测试存储库.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<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

在此注册:

DIContainer.Instance.RegisterType<ITagManager, TagManager>();

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

DIContainer.Instance.Resolve<ITagManager>().RetrieveTwitterTags();
相关文章: