-1

我无法让基本 DI 在我的核心 3.1 项目中工作。我的类有一个无参数构造函数,但在调用控制器方法时出现此错误:无法创建类型为“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 个参数的构造函数。我认为这是另一个gimmee:

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

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

非常感谢!我花了时间研究,只是因为截止日期紧迫才问。

4

1 回答 1

0

根据 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 容器注入它,它将为您传递所有必要的依赖项。

于 2021-02-19T08:07:58.743 回答