我尝试回答我自己的问题:如果有任何对您不利的地方,请随时纠正我。
我将使用以下词语:
如果您的应用程序分为 n 层和 n 个模块,则以下可能是特定模块和层的特定类的示例。
public static class ProductMapper
{
static ProductMapper()
{
MapProductBDOToDTO();
MapProductDTOToBDO();
MapProductCategoryBDOToDTO();
MapProductCategoryDTOToBDO();
MapIvaBDOToDTO();
MapIvaDTOToBDO();
MapProductSupplierBDOToDTO();
MapProductSupplierDTOToBDO();
MapProductPictureBDOToDTO();
MapProductPictureDTOToBDO();
MapProductNoteBDOToDTO();
MapProductNoteDTOToBDO();
MapStockProductBDOToDTO();
MapStockProductDTOToBDO();
MapTagBDOToDTO();
MapTagDTOToBDO();
}
public static TTargetType Convert<TToConvert, TTargetType>(TToConvert toConvert)
{
return Mapper.Map<TTargetType>(toConvert);
}
private static void MapProductDTOToBDO()
{
Mapper.CreateMap<ProductDTO, ProductBDO>();
}
private static void MapProductBDOToDTO()
{
Mapper.CreateMap<ProductDTO, ProductBDO>().ReverseMap();
}
private static void MapProductCategoryDTOToBDO()
{
Mapper.CreateMap<ProductCategoryDTO, ProductCategoryBDO>();
}
private static void MapProductCategoryBDOToDTO()
{
Mapper.CreateMap<ProductCategoryBDO, ProductCategoryDTO>();
}
private static void MapIvaDTOToBDO()
{
Mapper.CreateMap<IvaDTO, IvaBDO>();
}
private static void MapIvaBDOToDTO()
{
Mapper.CreateMap<IvaBDO, IvaDTO>();
}
private static void MapProductSupplierDTOToBDO()
{
Mapper.CreateMap<ProductSupplierDTO, ProductSupplierBDO>();
}
private static void MapProductSupplierBDOToDTO()
{
Mapper.CreateMap<ProductSupplierDTO, ProductSupplierBDO>().ReverseMap();
}
private static void MapProductPictureDTOToBDO()
{
Mapper.CreateMap<ProductPictureDTO, ProductPictureBDO>();
}
private static void MapProductPictureBDOToDTO()
{
Mapper.CreateMap<ProductPictureDTO, ProductPictureBDO>().ReverseMap();
}
private static void MapProductNoteDTOToBDO()
{
Mapper.CreateMap<ProductNoteDTO, ProductNoteBDO>();
}
private static void MapProductNoteBDOToDTO()
{
Mapper.CreateMap<ProductNoteDTO, ProductNoteBDO>().ReverseMap();
}
private static void MapStockProductDTOToBDO()
{
Mapper.CreateMap<StockProductDTO, StockProductBDO>();
}
private static void MapStockProductBDOToDTO()
{
Mapper.CreateMap<StockProductDTO, StockProductBDO>().ReverseMap();
}
private static void MapTagDTOToBDO()
{
Mapper.CreateMap<TagDTO, TagBDO>();
}
private static void MapTagBDOToDTO()
{
Mapper.CreateMap<TagDTO, TagBDO>().ReverseMap();
}
如您所见,它是一个带有静态构造函数的静态类,这意味着在应用程序生命周期内,构造函数的调用次数不会超过一次。第一次调用 Convert 方法时,会调用构造函数并创建所有映射。第二次、第三次、第四次……在同一会话期间,您将调用 Convert 方法的 n 次,将不会调用构造函数。
优点:
- 不能多次创建特定映射
- 映射仅在您需要时创建(在这种情况下,当您使用产品时)。您不会在应用程序启动时创建 1000 个映射,然后只使用其中的 5 个或 6 个。
缺点:
- 开发人员可以使用他/她想要的所有类型调用通用 Convert 方法,不检查类型。顺便说一句,使用泛型方法需要更少的代码,如果尚未创建映射,则 AutoMapper 将抛出异常。