.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错误。 当我删除构造函数/存储库变量时,我没有问题。
您可能需要进行以下两项更改之一:
- 从存储库的构造函数中删除参数,或
- 注册存储库构造函数所采用的服务。
说明
您问题中的确切代码适用于以下存储库代码。
public interface ITestRepository { } public class TestRepository : ITestRepository { }
但是,如果构造函数接受参数,则代码会抛出500错误。
public class TestRepository : ITestRepository { public TestRepository(object someObject) { } }
它抛出了该构造函数,因为对services.AddScoped
的调用要求TestRepository
构造函数满足这两个条件之一。
- 没有参数的构造函数,或
- 采用可解析服务的构造函数。
因此,要修复代码,您需要进行以下两项更改之一:
- 从构造函数中删除参数,或
- 注册构造函数所使用的服务。
例如,如果存储库在其构造函数中使用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();