代码之家  ›  专栏  ›  技术社区  ›  Ashley Kilgour

在解决方案中有两个项目,每个项目都有自己的AutoMapper配置

  •  0
  • Ashley Kilgour  · 技术社区  · 7 年前

    我想在我的解决方案中有两个具有自己的自动映射共轭的项目。

    我有一个ASP。Net MVC项目,下面是一个使用实体框架的类库。

    类库使用EF获取实体,然后使用自动映射器将其转换为DTO,MVC应用程序使用自动映射器将DTO转换为MVC模型。

    我只是不知道在MVC项目Global中设置自动映射器的正确方法。尽快。cs Application\u Start()我有AutoMapperConfiguration。Configure();这需要。

     public static void Configure()
        {
            Mapper.Initialize(c =>
            {
                c.CreateMap<FooDTO, Foo>().ReverseMap();
            });
        }
    

    这很简单,因为在应用程序启动时会调用它。 我能解决的问题是类库。

    在类库中,我创建了第二个自动映射器设置

    public static class AutoMapperConfiguration
    {
        public static void Configure()
        {
            Mapper.Initialize(c =>
            {
                c.CreateMap<Foo, FooDTO>().ReverseMap();
            });
        }
    }
    

    在类库中,我创建了一个FooService类,在构造函数中

    public FooService()
        {
            AutoMapperConfiguration.Configure();
        }
    

    所以,这不仅难闻,因为我需要有AutoMapperConfiguration。Configure();在每个服务构造函数中。但当代码进入AutoMapperConfiguration时,它也会出现以下错误。Configure();

    映射器已初始化。每个应用程序域/进程必须调用一次Initialize。

    那么,设置自动映射器的最佳方法是什么?

    1 回复  |  直到 7 年前
        1
  •  3
  •   ssmith    7 年前

    我通常在应用程序的根目录中设置Automapper(在您的案例中,是ASP.NET MVC项目)。从那里,它通常可以访问需要映射的任何/所有类型,因为它将具有对EF类库的项目引用。您应该能够从EF实体映射到DTO,并从DTO映射到该项目的MVC模型。

    顺便提一下,我想知道为什么在这个场景中使用DTO。避免直接从MVC控制器使用EF实体(不要将它们暴露于模型绑定中),这无疑是一个很好的设计,但通常可以映射到控制器中的域实体/数据模型。例如,假设您有一个EF负责存储的客户实体。在CustomerController中,您可能有一个传递给视图的CustomerServiceModel,或者有一个从API调用返回的CustomerTo。您可以从帖子中接受新的CustomerModel。在任何一种情况下,您都可能在控制器(或控制器调用的过滤器或服务)中的MVC特定模型和域实体之间进行映射。但是映射中不需要第三组类型。