C# .NETCore—尝试将存储库添加到API控制器,但每次添加时,每个控制器方法都返回500错误

C# .NETCore—尝试将存储库添加到API控制器,但每次添加时,每个控制器方法都返回500错误,c#,asp.net,asp.net-web-api,asp.net-web-api2,asp.net-core,C#,Asp.net,Asp.net Web Api,Asp.net Web Api2,Asp.net Core,正如标题所说。我正在创建一个Web API,在我的API控制器中,我试图在构造函数中声明一个存储库。我成功地声明了它,但我试图在该控制器中调用的每个API方法都返回一个500错误。当我删除构造函数/存储库变量时,我没有任何问题 控制器 [Route("api/[controller]")] public class TestController: Controller { private ITestRepository _testRepository; public TestCon

正如标题所说。我正在创建一个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" };
   }
}
[路由(“api/[控制器]”)]
公共类TestController:控制器
{
私有ITestRepository测试存储库;
公共测试控制器(ITestRepository测试存储库)
{
_testRepository=testRepository;
}
[HttpGet]
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
}
Startup.cs

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

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

    services
        .AddEntityFramework()
        .AddInMemoryDatabase()
        .AddDbContext<TestDbContext>(); // register a service

    services.AddScoped<ITestRepository, TestRepository>();
    services.AddSwaggerGen();
}
public class TestRepository : ITestRepository
{
    // pass the registered service to the ctor
    public TestRepository(TestDbContext testDbContext)
    {

    }
}
public void配置服务(IServiceCollection服务)
{
//添加框架服务。
服务
.AddMvcCore()
.AddJsonFormatters()文件
.AddApiExplorer();
services.addScope();
services.addswagggen();
}
我遗漏了什么吗?

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

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

  • 从存储库的构造函数中删除参数,或
  • 注册存储库的构造函数使用的服务
  • 解释 您问题中的确切代码适用于以下存储库代码

    public interface ITestRepository { }
    
    public class TestRepository : ITestRepository { }
    
    但是,如果构造函数接受参数,代码将抛出500错误

    public class TestRepository : ITestRepository
    {
        public TestRepository(object someObject)
        {
    
        }
    }
    
    它与该构造函数一起抛出,因为调用
    services.addScope()
    需要
    TestRepository
    构造函数满足这两个条件之一

  • 没有参数的构造函数,或
  • 接受可解析服务的构造函数
  • 因此,要修复代码,您需要进行以下两项更改之一:

  • 从构造函数中删除参数,或
  • 注册构造函数所使用的服务
  • 例如,如果存储库在其构造函数中采用DbContext,那么您的代码可能如下所示

    Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
       // Add framework services.
       services
          .AddMvcCore()
          .AddJsonFormatters()
          .AddApiExplorer();
    
       services.AddScoped<ITestRepository , TestRepository >();    
       services.AddSwaggerGen();
    }
    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvcCore()
            .AddJsonFormatters()
            .AddApiExplorer();
    
        services
            .AddEntityFramework()
            .AddInMemoryDatabase()
            .AddDbContext<TestDbContext>(); // register a service
    
        services.AddScoped<ITestRepository, TestRepository>();
        services.AddSwaggerGen();
    }
    
    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" };
        }
    }
    
    公共类TestController:Controller
    {
    私有ITestRepository测试存储库;
    公共测试控制器(ITestRepository测试存储库)
    {
    _testRepository=testRepository;
    }
    [HttpGet]
    公共IEnumerable Get()
    {
    返回新字符串[]{“value1”,“value2”};
    }
    }
    
    在这里注册:

    DIContainer.Instance.RegisterType<ITagManager, TagManager>();
    
    DIContainer.Instance.RegisterType();
    
    我们在使用依赖项之前先解决它们

    DIContainer.Instance.Resolve<ITagManager>().RetrieveTwitterTags();
    
    DIContainer.Instance.Resolve().RetrieveTwitterTags();
    
    确切的错误消息是什么?@CodeNotFound这只是一个500内部服务器错误。没有提供其他信息。我试图在控制器级别对其进行调试,但调试程序在崩溃之前甚至无法到达那里。您的存储库类是否具有无参数构造函数?给我们看代码?