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

时间:2018-01-24 15:11:37

标签: c# automapper

我希望在我的解决方案中有两个项目具有自己的自动映射器绑定。

我有一个ASP.Net MVC项目,并且有一个使用实体框架的类库。

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

我只是不知道为此设置自动映射器的正确方法,在MVC项目中,Global.asax.cs Application_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();

时,它也会出现以下错误

Mapper已初始化。您必须为每个应用程序域/进程调用一次Initialize。

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

1 个答案:

答案 0 :(得分:3)

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

顺便说一句,我质疑你在这种情况下使用DTO的原因。这绝对是一个很好的设计,可以避免直接从MVC控制器中使用EF实体(不要将它们暴露给模型绑定),但通常可以映射到控制器内的域实体/数据模型。例如,假设您有一个EF负责存储的Customer实体。在您的CustomersController中,您可能有一个CustomerViewModel,您将其传递给从API调用返回的View或CustomerDTO。您可以从POST接受NewCustomerModel。在任何这些情况下,您可能会在MVC特定模型与控制器内的域实体(或过滤器或控制器调用的服务中)之间进行映射。但是你不需要映射中涉及的第三组类型。