net core 3.1 dep inj 简单场景中的错误,ILogger 奖金问题

问题描述

我无法在我的核心 3.1 项目中使用基本 DI。我的类有一个无参数构造函数,但在调用我的控制器方法时出现此错误:无法创建类型为“NRA_Courses.Interfaces.ICourseRunner”的实例。模型绑定复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数。 请注意,我什至添加一个空的构造函数以使其明确。我忽略了什么?

    public interface ICourseRunner
    {
        void StartCourse();

        void PauseCourse();

        public ICourse Course { get; set; }
        public IStudent Student { get; set; }
    }

// Implementing class
    public class CourseRunner : ICourseRunner
    {
        public ICourse Course { get; set; }
        public IStudent Student { get; set; }

        private Timer _timer => new Timer();

        private DateTime _timeStarted;
        private TimeSpan _timeRunAfterPauses;

        public CourseRunner()
        {}

        public void StartCourse()
        {
           // implemented
        }

        public void PauseCourse()
        {
           // implemented
        }

        private void OnTimedEvent(Object source,System.Timers.ElapsedEventArgs e)
        {
           // implemented
        }
    }


// Method in a controller where I want ICourseRunner injected
        public void StartCourseTimer(CourseList courseStarted,ICourseRunner courseRunner)
        { ...}

额外的问题,为什么我不能将日志注入到这样的简单类中?此代码在我尝试执行“= new Student()”的行中导致编译错误,因为 Student 不包含采用 0 个参数的构造函数。我认为这是另一个噱头:

    public class Student : IStudent
    {
        ...
        private readonly ILogger<Student> _logger;

        public Student(ILogger<Student> logger)
        {
            _logger = logger;
        }
        ...
    }

多谢!我花了时间研究,只是因为截止日期紧迫。

解决方法

根据 Asp.Net Core 控制器的文档,控制器应该通过构造函数 https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection?view=aspnetcore-5.0 使用注入。 在您的情况下,您正在尝试通过方法参数注入依赖项,这可能无法正常工作。如果你通过构造函数注入它(就像你在 Student 的例子中一样),一切都应该正常工作。

奖励问题的答案 - 错误消息提供了所有必要的信息 - 您不能仅仅因为您的类没有无参数构造函数就通过无参数构造函数创建 Student 的实例。那里唯一的一个构造函数 - 带有一个参数“ILogger logger”。如果您想通过构造函数创建 Student 的实例 - 您应该将记录器的实例传递给它。另一种方式 - 通过 DI 容器注入它,该容器将为您传递所有必要的依赖项。