通過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映射的。