我想开发一个应用程序来管理由用户或核心逻辑本身分配的任务,但是这些任务不会立即被调用(甚至可能一年后)。
因此,这些任务需要以某种方式存储在数据库中。我想要一些作为调度程序(如TaskScheduler)来管理任务,但同时也与数据库交互的东西。
我很感激任何人给我指出正确的方向,一些我自己实现的设计模式或为这个确切目的编写的库。
这可以很容易地用Newtonsoft完成。
首先,声明一个表示任务工厂的接口:
public interface ITaskFactory<T> {
Task<T> CreateTask(UnserializableContext context);
}
(其中UnserializableContext是任何不能被序列化但需要在任务中引用的对象)
然后创建一个具体的类,为你必须管理的每一个不同的任务实现它,例如:
public class MultiplyTaskFactory: ITaskFactory<int> {
public int A { get; set; }
public int B { get; set; }
public Task<int> CreateTask(UnserializableContext context) {
return Task.FromResult(A * B);
}
}
public class SumTaskFactory: ITaskFactory<int> {
public int C { get; set; }
public int D { get; set; }
public Task<int> CreateTask(UnserializableContext context) {
return Task.FromResult(C + D);
}
}
为了将任务工厂存储在数据库中,我们可以将它们转换为json。
var taskFactory1 = new MultiplyTaskFactory { A = 10, B = 2 };
var taskFactory2 = new SumTaskFactory { C = 3, D = 4 };
var taskFactory1AsJson = JsonConvert.SerializeObject(taskFactory1, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
var taskFactory2AsJson = JsonConvert.SerializeObject(taskFactory2, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
你现在可以存储taskFactory1AsJson和taskFactory2AsJson在你的数据库。
感谢TypeNameHandling。在所有设置中,您可以轻松地反序列化任务工厂,而不必担心具体类型,也不会丢失它们在存储时所具有的属性:
var taskFactory1 = JsonConvert.DeserializeObject<ITaskFactory>(taskFactory1AsJson, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
await taskFactory1.CreateTask(context);
试试Hangfire (https://www.hangfire.io)。也许有你需要的功能
这将仅限于Windows机器吗?如果是这样,请考虑这个作为Windows任务管理器托管包装器的开源项目:https://github.com/dahall/taskscheduler
你可以在你的数据库中管理额外的细节,并让Windows任务调度程序负责触发逻辑,记录历史等。