当前位置: 首页 > 知识库问答 >
问题:

遇到CS0310错误时如何在构造函数中使用参数

邵轶
2023-03-14

我为调度作业创建了以下抽象:

public abstract class BaseJob
{
    public string? JobId { get; set; }
}

public interface IJobData
{ }

public interface IJob<in TJobData> where TJobData : IJobData
{
    Task ExecuteAsync(TJobData jobData);
}

我利用工厂创造就业机会:

public class JobCreator<TJob, TJobData>
    where TJob : IJob<TJobData>, new()
    where TJobData : IJobData
{
    public async Task ExecuteAsync(TJobData jobData)
    {
        var job = new TJob();
        await job.ExecuteAsync(jobData);
    }
}

示例实现:

public record ForgotPasswordJobData() : IJobData;

public class ForgotPasswordJob: BaseJob, IJob<ForgotPasswordJobData>
{
    private readonly IMailService _mailer;

    public ForgotPasswordJob(IMailer mailer)
    {
        _mailer = mailer;
    }

    public Task ExecuteAsync(ForgotPasswordJobData jobData)
    {
       // Do something
       // Send mail
    }
}

这是作业排队的方式:

JobClient.Enqueue<JobCreator<ForgotPasswordJob, ForgotPasswordJobData>>(job => job.ExecuteAsync(jobData));

因为ForgetPasswordJobs没有无参数构造函数,所以我得到一个CS0310错误,它说

为了将其用作泛型类型或方法JobCreator中的参数参数,类型“忘记密码作业”必须是具有公共无参数构造函数的非抽象类型

如何在IJob的实现中使用依赖关系?

共有1个答案

柴正祥
2023-03-14

您需要告诉您的JobCreater如何实例TJob

public class JobCreator<TJob, TJobData>
where TJob : IJob<TJobData>
where TJobData : IJobData
{
    public async Task ExecuteAsync(Func<TJob> createJob, TJobData jobData)
    {
        var job = createJob();
        await job.ExecuteAsync(jobData);
    }
}


var mailService = new MailService();
JobClient.Enqueue<JobCreator<ForgotPasswordJob, ForgotPasswordJobData>>(
    job => job.ExecuteAsync(() => new ForgotPasswordJob(mailService), jobData));

虽然我不确定JobCreator是否真的有必要

您可以更改您的JobClient,以接受已经实例化的作业,考虑到它不依赖于Enline中的任何内容:

void Enqueue<TJob, TJobData>(TJob job, TJobData jobData)
where TJob : IJob<TJobData>
where TJobData : IJobData
{
    // ...
    Task jobTask = job.ExecuteAsync(jobData);
    // ...
}

var forgotPasswordJob = new ForgotPasswordJob(new MailService());
JobClient.Enqueue(forgotPasswordJob, jobData);
 类似资料:
  • 当我在代码中进行扫描后到达此部分时,我收到此错误: Project2_JoshuaLucas[,0,0,0x0,无效,布局=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=350,hei

  • 所以我正在我的Java项目(Google Guice)中实现一个依赖注入框架,一切都很好,我喜欢它,但是有一个小问题;我想为我的主项目的类创建一个静态实例(实例化依赖项等)。但是我不知道使用Guice实例化它的任何方法,我不能手动实例化它,因为我在它的构造函数中使用DI(我在构造函数中有对象),这意味着我不能访问实例化该类所需的类的非静态变量。我试着使用一个提供者,但是我真的不明白在哪里绑定它,因

  • 我是新的Android和Java,并试图使基于位置的应用程序。 编辑 我做了一个非常非常简单的测试代码,得到了同样的错误。这是java: 我也犯了同样的错误。以下是我的应用程序级构建中的依赖项。格雷德尔: 原帖 我试图使用ViewModel和LiveData来更新用户位置,因为我知道这是生命周期感知的最佳方式。我有一个默认的地图活动... 一个扩展LiveData以存储用户位置的类。。。 以及一个

  • 1.如何通过参数化构造函数设置这些属性?? 类文件 > 我想通过传递参数构造函数的setter设置这些属性,但它没有设置这些属性 在这里,我想通过toString方法显示属性 }对象文件 为什么我无法通过构造函数设置这些属性?? public class Runnable{public static void main(String[]args){Product p1=新产品(“pc”,“Grey

  • 我在创建对象和参数化构造函数时遇到以下错误。 Main.java: 6:错误:构造函数Cipher类中的Cipher不能应用于给定类型 必需:无参数 找到:int 原因:实际参数列表和正式参数列表的长度不同 这是我的文件的样子