我為調度作業創建了以下抽象:
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));
因為 ForgetPasswordJob 沒有無引數的建構式,所以我收到了一個CS0310錯誤,它說
型別“ForgotPasswordJob”必須是具有公共無引數建構式的非抽象型別,以便將其用作泛型型別或方法“JobCreator<IJob,IJobData>”中的引數“引數”
如何在 IJob 的實作中使用依賴項?
uj5u.com熱心網友回復:
您需要告訴您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的接受一個已經實體化的作業,考慮到它不依賴于 Enqueue 中的任何東西:
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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376749.html
標籤:C#
上一篇:帶有本地路徑的FileInfo.MoveTo后C#檔案消失(Windows)
下一篇:如何使用System.Text.Json將json字串或流反序列化為Dictionary<string,string>
