通过IStartupTask实现初始化任务
来自norp.Core的接口IStartupTask
public interface IStartupTask { void Execute(); int Order { get; } }
public int Order //通过Order来对同一Interface的implementation的Class初始化排序。 { get { return 0; } }
在每个项目中,有些类,例如Nop.Web下的AutoMapperStartUPtask/AdminStartupTask.总之名称看起来是*StartupTask.cs,以Nop.Data的EfstartUpTask为例:
namespace Nop.Data { public class EfStartUpTask : IStartupTask { public void Execute() { if (!DataSettingsHelper.DatabaseIsInstalled()) return; var settings = EngineContext.Current.Resolve<DataSettings>(); if (settings != null && settings.IsValid()) { var provider = EngineContext.Current.Resolve<IEfDataProvider>(); if (provider == null) throw new NopException("No EfDataProvider found"); provider.SetDatabaseInitializer();//执行数据初始化 } } public int Order { //ensure that this task is run first get { return -1000; } } } }
//如何启动这些Task的?
private void RunStartupTasks() {
// namespace Nop.Core.Infrastructure.DependencyManagement. ContainerManager
// var typeFinder = _containerManager.Resolve<ITypeFinder>(); //传统方式通过IstartupTask接口找到所有的类
var startUpTaskTypes = typeFinder.FindClassesOfType<IStartupTask>(); var startUpTasks = new List<IStartupTask>(); foreach (var startUpTaskType in startUpTaskTypes)
//Activator.createInstance创建Instance startUpTasks.Add((IStartupTask)Activator.CreateInstance(startUpTaskType)); //sort 体现了如果根据Order排序 startUpTasks = startUpTasks.AsQueryable().OrderBy(st => st.Order).ToList(); foreach (var startUpTask in startUpTasks) startUpTask.Execute(); //调用Execute方式执行 }
总结:
通过以上的分析可以掌握如何使用IstartupTask架构来实现额外的系统数据初始化;回顾目前的三个StartupTask
EfstartupTask用于数据库数据的初始化;AdminStratupTask目前仅用于Telerik控件的语言本地化注册;AutoMapperStartup是用于通过AutoMapper创建OO映射的。