Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC多层应用程序:在何处放置Automapper初始化?_C#_Asp.net Mvc_Automapper_Multi Layer - Fatal编程技术网

C# ASP.NET MVC多层应用程序:在何处放置Automapper初始化?

C# ASP.NET MVC多层应用程序:在何处放置Automapper初始化?,c#,asp.net-mvc,automapper,multi-layer,C#,Asp.net Mvc,Automapper,Multi Layer,我正在创建一个多层应用程序,将asp.NETMVC应用程序作为最高层 体系结构如下(-->表示引用): 表示层-->服务层-->业务层-->数据访问层-->数据库 此外,还有一个称为“基础结构”的层,所有层都引用该层 每个层都有自己的实体。例如:在表示层中,我们可能有UserViewModel,在服务层UserDTO,在业务层UserBDO,最后在数据访问层User automapper用于自动化不同类型之间的转换 我读到一些开发人员建议将映射创建放在Global.asax中,但是很明显,如果您

我正在创建一个多层应用程序,将asp.NETMVC应用程序作为最高层

体系结构如下(-->表示引用):

表示层-->服务层-->业务层-->数据访问层-->数据库

此外,还有一个称为“基础结构”的层,所有层都引用该层

每个层都有自己的实体。例如:在表示层中,我们可能有UserViewModel,在服务层UserDTO,在业务层UserBDO,最后在数据访问层User

automapper用于自动化不同类型之间的转换

我读到一些开发人员建议将映射创建放在Global.asax中,但是很明显,如果您有一个多层应用程序,您不能在那里创建所有映射。无法在表示层中将用户映射为UserBDO


因此,我要求以最干净的方式管理多层应用程序中的映射集中。您甚至可以建议对体系结构进行更改。

我建议您已经有了答案-如果您无法在一个位置访问所有类型-只需将映射配置拆分为几个部分即可。此解决方案在大型项目中更易于维护(只需想象在一个配置中有100或1000个映射)。例如,我们使用特定映射器将第三方WCF合同转换为自定义DTO。此映射器与WCF客户端位于单独的项目中。因此,合同和映射无法从外部访问。

我试着回答我自己的问题:如果有什么听起来不好的地方,请随时纠正我

我将使用以下词语:

  • 层:在这个上下文中,层是应用程序的垂直意义上的模块(从数据库到用户界面)

  • 模块:横向意义上的应用程序的一个区域,例如“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();
    }
公共静态类ProductMapper
{
静态ProductMapper()
{
MapProductBDOToDTO();
MapProductdToToToBDO();
MapProductCategoryBDodTo();
MapProductCategoryToToToBDO();
MapIvaBDOToDTO();
MapIvaDTOToBDO();
MapProductSupplierBDOToDTO();
MapProductSupplierdToToToBDO();
MapProductPictureBDOToDTO();
MapProductPicturedToToToBDO();
mapproductnotebtodto();
MapProductNotedToToToBDO();
MapStockProductBDOToDTO();
MapStockProductDTOToBDO();
MapTagBDOToDTO();
MapTagDTOToBDO();
}
公共静态TTargetType转换(TToConvert-toConvert)
{
返回Mapper.Map(toConvert);
}
私有静态void MapProductDTOToBDO()
{
CreateMap();
}
私有静态void MapProductBDOToDTO()
{
Mapper.CreateMap().ReverseMap();
}
私有静态void MapProductCategoryToToToBDO()
{
CreateMap();
}
私有静态void MapProductCategoryBDodTo()
{
CreateMap();
}
私有静态void MapIvaDTOToBDO()
{
CreateMap();
}
私有静态void MapIvaBDOToDTO()
{
CreateMap();
}
私有静态void MapProductSupplierdToToToBDO()
{
CreateMap();
}
私有静态void MapProductSupplierBDOToDTO()
{
Mapper.CreateMap().ReverseMap();
}
私有静态void MapProductPicturedToToToBDO()
{
CreateMap();
}
私有静态void MapProductPictureBDOToDTO()
{
Mapper.CreateMap().ReverseMap();
}
私有静态void MapProductNoteDTOToBDO()
{
CreateMap();
}
私有静态void MapProductNoteBDOToDTO()
{
Mapper.CreateMap().ReverseMap();
}
私有静态void MapStockProductDTOToBDO()
{
CreateMap();
}
私有静态void MapStockProductBDOToDTO()
{
Mapper.CreateMap().ReverseMap();
}
私有静态void MapTagDTOToBDO()
{
CreateMap();
}
私有静态void MapTagBDOToDTO()
{
Mapper.CreateMap().ReverseMap();
}
正如您所看到的,它是一个带有静态构造函数的静态类,这意味着在应用程序生命周期内调用构造函数的次数不会超过一次。 第一次调用Convert方法时,将调用构造函数并创建所有映射。 第二次、第三次、第四次…n在同一会话中调用Convert方法时,将不会调用构造函数

优点:

  • 不能多次创建特定映射
  • 只有当您需要映射时(在本例中,当您使用产品时),才会创建映射。您不会在应用程序启动时创建1000个映射,然后只使用其中的5或6个
缺点:

  • 开发人员可以使用他/她想要的所有类型调用generic Convert方法,类型不会被检查。顺便说一下,使用generic方法需要更少的代码,如果映射尚未创建,则AutoMapper将引发异常

您是否有实用程序或框架之类的层,在那里您可以公开一个可以从type和ToTYPE键入并转换的函数?您需要一个实用程序项目或类似的东西。您的枚举(命名)保存在哪里?ooe请注意,如果您只有一个已部署的应用程序,请不要创建所有这些项目。只需使用单个MVC项目中的文件夹即可。@error Fatale如果这只是一个预测,则仍然没有理由创建n层体系结构:)应将项目视为物理可重用性的单元。如果没有,则