.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();
}
我错过了什么吗?
简答题
我正在尝试在构造函数中声明一个存储库。我成功声明了它,但我尝试在该控制器中调用的每个 API 方法都会返回 500 错误。当我删除构造函数/存储库变量时,我没有问题。
您可能需要进行以下两项更改之一:
- 从存储库的构造函数中删除参数,或者
- 注册存储库的构造函数采用的服务。
解释
问题中的确切代码适用于以下存储库代码。
public interface ITestRepository { }
public class TestRepository : ITestRepository { }
但是,如果构造函数采用参数,则代码会引发 500 错误。
public class TestRepository : ITestRepository
{
public TestRepository(object someObject)
{
}
}
它与该构造函数一起抛出,因为对services.AddScoped<ITestRepository, TestRepository>()
的调用要求TestRepository
构造函数满足这两个条件之一。
- 没有参数的构造函数,或
- 采用可解析服务的构造函数。
因此,要修复您的代码,您需要进行以下两个更改之一:
- 从构造函数中删除参数,或者
- 注册构造函数采用的服务。
例如,如果存储库在其构造函数中采用 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();