【问题标题】:Runtime Null Reference Exception Using SimpleInjector in WebApi Controller在 WebApi 控制器中使用 SimpleInjector 的运行时空引用异常
【发布时间】:2018-11-19 22:21:48
【问题描述】:

在我的 MVC 项目中,我有一个我想使用依赖注入的 API 控制器。我正在使用Simple Injector 进行依赖注入。

这是我的 api 控制器:

public class MedicInfoesApiController : ApiController
{
    private readonly IDiContext _dbContext;

    public MedicInfoesApiController() { }

    public MedicInfoesApiController(IDiContext diContext)
    {
        _dbContext = diContext;
    }

    // POST: api/MedicInfoesApi
    [ResponseType(typeof(MedicInfo))]
    public IHttpActionResult PostMedicInfo(MedicInfo medicInfo)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        // Create empty Employee Object to get info of person being submitted via IBM
        Employee emp = new Employee();

        //check if IBM that user is submitting exists
        if (!EmployeeData.IsValidIBM(medicInfo.MedicIbm))
        {
            ModelState.AddModelError("", "This IBM does not exist!");
        }
        // Check if any existing IBM's match what the user is trying to submit... if none then save to database
        else if (_dbContext.GainAccess().MedicInfoes.Any(x => x.MedicIbm.Equals(medicInfo.MedicIbm, StringComparison.CurrentCultureIgnoreCase)))
        {
            ModelState.AddModelError("", "This person already exists!");
        }

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        else
        {
            // Set empty Employee object with Data of person
            emp = EmployeeData.GetEmployee(medicInfo.MedicIbm);
            medicInfo.Active = true;
            _dbContext.GainAccess().MedicInfoes.Add(medicInfo);

            _dbContext.GainAccess().SaveChanges();
        }

调试时,else if 语句出现运行时错误:

x.MedicIbm=error CS0103:名称“x”在当前上下文中不存在

_dbContext=null

依赖注入可以与 api 控制器一起使用吗?我以为他们可以?

非常感谢任何关于为什么会发生这种情况的解释或帮助。

【问题讨论】:

  • 能否请您在添加此依赖项的位置提供您的 DI 注册。

标签: c# asp.net-mvc asp.net-web-api dependency-injection simple-injector


【解决方案1】:

正在调用默认构造函数,因此不会注入上下文。因此 null

ApiController中移除默认构造函数,并保持关注

public MedicInfoesApiController(IDiContext diContext) {
    _dbContext = diContext;
}

还要确保IDiContext 已正确注册到 DI 容器

参考ASP.NET Web API Integration Guide for Simple Injector

【讨论】:

  • 好的,这是我最初的想法。我了解空引用异常,但如果我将其注释掉,则会收到运行时控制台错误:"An error occurred when trying to create a controller of type 'MedicInfoesApiController'. Make sure that the controller has a parameterless public constructor."..."Type 'AviationMedicTraining.Controllers.ApiControllers.MedicInfoesApiController' does not have a default constructor"
  • 这是默认错误消息,并不代表您认为的那样。该消息是当框架在解决其依赖关系时无法创建控制器时。您是否查看了答案的第二部分。
  • 您好@M12Bennett,请按照 Nkosi 所指的简单注射器的 ASP.NET Web API 集成指南进行操作。如果不使用 Simple Injector 的 SimpleInjectorWebApiDependencyResolver 替换默认的 DependencyResolver,Web API 将不会调用 Simple Injector。
  • 完美。抱歉,我没有使用您答案的底部。谢谢!
  • 对不起,刚刚又发生了一些事情......所以现在我的 api 控制器方法按预期被击中,但现在记录没有被添加/保存到数据库中。我已经编辑了我的代码以显示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多