NopCommerce按需创建一个计划任务
2016-04-24 17:01
267 查看
这段时间一直在倒腾NopCommerce二次开发,最近有个新需求,需要在每天的某时某刻对销售额做一个结算,而我们知道强大的NopCommerce有自己的一套任务管理机制,于是就想着在NopCommerce的基础之上添加一个自定义的计划任务。
首先,我们得研究Nop的源码,这段时间下来越来越发现Nop的代码精妙,所用到的技巧也是让我十分佩服,于是自己也越来越喜欢研究源码了。我们先找到任务管理的入口。在程序的启动开始处看到如下代码:
显然,任务在TaskManager这个类里面统一管理配置,进入该类定义:
通过Intialize这个方法查询数据库中所有的计划任务配置数据,并为每一个任务创建一个线程,并添加到线程集合中。
这个Start方法自然时启动每个线程的,然后在每个TaskThread对象里面执行了Run方法:
在Run方法中,执行了一个至关重要的Excute方法,这里是通过反射的方法从数据库中定义的对应type获取相应的Task实现,典型的工厂模式,如下图:
这里用的Nop自带的依赖注入框架AutoFac。至于中间为何有个if判断,是因为可能在容器中已经存在该类,注册依赖统一在Nop.Web.FrameWork.DenpendencyRegister中配置。
好了,搞清楚了整个计划任务的执行流程,我们可以来自行定义一个了,我们先创建一个新的类,并实现ITask接口。这个很重要,因为EngineContext会根据是否实现这个接口扫描注入Task。然后我们实现Excute方法,在里面做我们要做的事情即可,如下图:
如果需要一些指定的Service实例,只需要通过EngineContext取得之前在容器里面已经注入的实例或者使用Builder注册一个即可(这种将工厂模式做到极致的管理创建对象的手法真的是非常方便)。
最后一步,也是关键一步。在数据库ScheduleTask表中添加一条任务纪录,将Type设置成通过反射可获得该Task类实例一种写法,比如(命名空间,Nop.Services)
最后在后台管理界面就可编辑该任务信息了:
首先,我们得研究Nop的源码,这段时间下来越来越发现Nop的代码精妙,所用到的技巧也是让我十分佩服,于是自己也越来越喜欢研究源码了。我们先找到任务管理的入口。在程序的启动开始处看到如下代码:
显然,任务在TaskManager这个类里面统一管理配置,进入该类定义:
通过Intialize这个方法查询数据库中所有的计划任务配置数据,并为每一个任务创建一个线程,并添加到线程集合中。
这个Start方法自然时启动每个线程的,然后在每个TaskThread对象里面执行了Run方法:
在Run方法中,执行了一个至关重要的Excute方法,这里是通过反射的方法从数据库中定义的对应type获取相应的Task实现,典型的工厂模式,如下图:
这里用的Nop自带的依赖注入框架AutoFac。至于中间为何有个if判断,是因为可能在容器中已经存在该类,注册依赖统一在Nop.Web.FrameWork.DenpendencyRegister中配置。
好了,搞清楚了整个计划任务的执行流程,我们可以来自行定义一个了,我们先创建一个新的类,并实现ITask接口。这个很重要,因为EngineContext会根据是否实现这个接口扫描注入Task。然后我们实现Excute方法,在里面做我们要做的事情即可,如下图:
如果需要一些指定的Service实例,只需要通过EngineContext取得之前在容器里面已经注入的实例或者使用Builder注册一个即可(这种将工厂模式做到极致的管理创建对象的手法真的是非常方便)。
最后一步,也是关键一步。在数据库ScheduleTask表中添加一条任务纪录,将Type设置成通过反射可获得该Task类实例一种写法,比如(命名空间,Nop.Services)
最后在后台管理界面就可编辑该任务信息了:
相关文章推荐
- 从源码安装Mysql/Percona 5.5
- 如何在 Linux/Windows/MacOS 上使用 .NET 进行开发
- 如何在 Linux 中安装微软的 .NET Core SDK
- C#.NET获取拨号连接的宽带连接方法
- C#.Net ArrayList的使用方法
- 浅析Ruby的源代码布局及其编程风格
- PowerShell中使用.NET将程序集加入全局程序集缓存
- .net(c#)中的new关键字详细介绍
- 由vbs sort引发.NET Framework之间的关系说明
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- .NET中的async和await关键字使用及Task异步调用实例
- 基于.NET平台常用的框架和开源程序整理
- 介绍php设计模式中的工厂模式
- .Net中的json操作类用法分析
- .net实现序列化与反序列化实例解析
- .NET中的Timer类型用法详解
- 关于.net(C#)中的跨进程访问的问题
- .NET实现父窗体关闭而不影响子窗体的方法
- 基于.Net中的数字与日期格式化规则助记词的使用详解
- .NET微信公众号开发之公众号消息处理