我正在创建一个多层应用程序,将asp.net mvc应用程序作为最高层。
架构如下(--->表示引用):
表示层--->服务层--->业务层---->数据访问层---->数据库
此外,还有一个名为" Infrastracture"由所有图层引用。
每个图层都有自己的实体。例如:在表示层中,我们可能在服务层UserDTO中具有UserViewModel,在业务层UserBDO中,最后在数据访问层中具有User。
automapper用于自动化不同类型之间的转换。
我读到一些开发人员建议将映射创建放在Global.asax中,但很明显,如果你有一个多层应用程序,你就无法在那里创建所有映射。您无法在表示层中将User与UserBDO映射。
所以,我问最清洁的方法来管理多层应用程序中的映射集中化。您甚至可以建议对架构进行更改。
答案 0 :(得分:1)
我建议你已经有了答案 - 如果你无法在一个地方访问所有类型 - 只需将映射配置分成几个部分。此解决方案在大型项目中更易于维护(只需在一个配置中设想100或1000个映射)。例如,我们使用特定的映射器将第三方WCF合同转换为自定义DTO。此映射器与WCF客户端一起位于单独的项目中。因此,无法从外部访问合同和映射。
答案 1 :(得分:0)
我试着回答我自己的问题:如果有什么事情对你不好,请随时纠正我。
我将使用以下词语:
图层:在此上下文中,图层是垂直意义上的应用程序模块(从数据库到用户界面)
模块:横向意义上的应用程序区域,例如“CRM”,“产品”,“会计”,......每个人都有不同层次的代码。
如果您的应用程序分为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();
}
正如您所看到的,它是一个带有静态构造函数的静态类,这意味着在应用程序生命周期内构造函数的调用次数不会超过ONCE。 第一次调用Convert方法时,将调用构造函数并创建所有映射。 第二次,第三次,第四次......在同一个会话期间你将调用Convert方法,不会调用构造函数。
优点:
缺点: