前一篇文章介绍了一下AutoMapper,一个非常好用,强大的对象映射转换工具。有了前面AutoMapper的基础,我们就来分析一下NopCommerce源码架构中使用AutoMapper的地方。
主要用到的类或接口:
1、IStartupTask
2、AutoMapperStartupTask
3、MappingExtensions
4、nopEngine
一、IStartupTask接口
IStartupTask接口在程序启动的时候要运行的任务,里面只有一个方法Execute,实现个接口就是实现这个Execute方法,里面可以做一些程序初始化或者配置相关的事情。
namespace Nop.Core.Infrastructure
{
/// <summary>
/// Interface which should be implemented by tasks run on startup
/// </summary>
public interface IStartupTask
{
/// <summary>
/// Execute task
/// </summary>
void Execute();
/// <summary>
/// Order
/// </summary>
int Order { get; }
}
}
二、AutoMapperStartupTask
AutoMapperStartupTask就是实现了接口IStartupTask。在里面的Execute()方法中配置了所有的AutoMapper对象映射。
AutoMapper调用Mapper.CreateMap来创建对象之间的映射关系,如下代码:
Mapper.CreateMap<Address, AddressModel>()
Mapper.CreateMap的第一个参数是源类型,第二参数是目标类型。
三、MappingExtensions
MappingExtensions是一个静态类,里面封装了许许多多的扩展方法,其中就包括了调用AutoMapper的Mapper.Map方法来根据前面我们配置的对象映射关系返回转换完了后的指定对象。
public static StoreModel ToModel(this Store entity)
{
return Mapper.Map<Store, StoreModel>(entity);
}
public static Store ToEntity(this StoreModel model)
{
return Mapper.Map<StoreModel, Store>(model);
}
public static CategoryTemplateModel ToModel(this CategoryTemplate entity)
{
return Mapper.Map<CategoryTemplate, CategoryTemplateModel>(entity);
}
public static CategoryTemplate ToEntity(this CategoryTemplateModel model)
{
return Mapper.Map<CategoryTemplateModel, CategoryTemplate>(model);
}
这样相应的对象直接就可以调用扩展方法ToEntity或者ToModel转换成相应的对象了。
四、NopEngine
在项目中Nop.Core命名空间下Nop.Core.Infrastructure的类NopEngine里面有一个初始化方法RunStartupStasks,里面找到实现了接口IStartupTask所有实现,并动态的创建一个相应的对象,最后调用其方法Execute,也就完成了之前配置好的所有AutoMapper的映射关系初始化操作。
protected virtual void RunStartupTasks()
{
var typeFinder = _containerManager.Resolve<ITypeFinder>();
var startUpTaskTypes = typeFinder.FindClassesOfType<IStartupTask>();
var startUpTasks = new List<IStartupTask>();
foreach (var startUpTaskType in startUpTaskTypes)
startUpTasks.Add((IStartupTask)Activator.CreateInstance(startUpTaskType));
//sort
startUpTasks = startUpTasks.AsQueryable().OrderBy(st => st.Order).ToList();
foreach (var startUpTask in startUpTasks)
startUpTask.Execute();
}