我希望在我的解决方案中有两个项目具有自己的自动映射器绑定。
我有一个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。
那么为此设置自动映射器的最佳方法是什么?
答案 0 :(得分:3)
我通常在应用程序的根目录中设置Automapper(在您的情况下,是ASP.NET MVC项目)。从那里,它通常可以访问需要映射的任何/所有类型,因为它将具有对EF类库的项目引用。您应该能够从EF实体映射到DTO,从DTO映射到MVC模型。
顺便说一句,我质疑你在这种情况下使用DTO的原因。这绝对是一个很好的设计,可以避免直接从MVC控制器中使用EF实体(不要将它们暴露给模型绑定),但通常可以映射到控制器内的域实体/数据模型。例如,假设您有一个EF负责存储的Customer实体。在您的CustomersController中,您可能有一个CustomerViewModel,您将其传递给从API调用返回的View或CustomerDTO。您可以从POST接受NewCustomerModel。在任何这些情况下,您可能会在MVC特定模型与控制器内的域实体(或过滤器或控制器调用的服务中)之间进行映射。但是你不需要映射中涉及的第三组类型。