我正在尝试使用C#编写作业排队系统。
假设我有以下课程,代表以后要做的工作:
public class TestJob : QueuableJob
{
private readonly string _t;
private readonly string _e;
public TestJob(string t, string e)
{
_t = t;
_e = e;
}
public Task PerformWork(ITestService testService)
{
testService.Message($"Hello: {_t} {_e}");
return Task.CompletedTask;
}
}
我希望能够打电话给类似的人
JobQueueService.EnqueueJob(new TestJob("value1", "value2"));
为了使作业排队,我需要序列化传递给TestJob
的构造函数的参数,以便可以将它们存储在持久层(例如数据库)中,然后反序列化它们。然后,我可以实例化该类并执行PerformWork
。我想在我的库中尽可能无缝地处理此问题,因此最终用户编写“ Job”类时不必担心要添加特定的东西进行序列化。
我无法想出一种方法来“拦截”传递给TestJob
类的参数,而又不会丢失严格的键入(例如,我可以使用params object[] parameters
)或迫使最终用户实施其他一些方法代码以帮助进行序列化。
目前,我能想到的(对于最终用户)最优雅的解决方案是这样的:
public class TestJob : QueuableJob
{
private readonly string _t;
private readonly string _e;
public TestJob(string t, string e) : base(t,e)
{
_t = t;
_e = e;
}
public Task PerformWork(ITestService testService)
{
testService.Message($"Hello: {_t} {_e}");
return Task.CompletedTask;
}
}
但是,这将要求开发人员记住将其所有参数传递给base()(例如上例中的base(t,e)
)。如果他们忘记这样做,编译器将不会抱怨,因此它可能是棘手的错误的来源。
我还尝试过在QueuableJob构造函数中使用System.Diagnostics.StackTrace
获取信息,但是它不相信我可以从堆栈中获取参数的 values 。
有什么方法可以使用反射来“拦截”传递给TestJob构造函数的内容吗?