在N层应用程序中配置自动映射

时间:2018-06-01 03:07:24

标签: c# asp.net-web-api automapper n-tier-architecture

我有一个N层应用程序,如下所示

MyApp.Model - 包含edmx和数据模型

MyApp.DataAccess - 包含EF的存储库

MyApp.Domain - 域名/商家模式

MyApp.Services - 服务(类库)

MyApp.Api - ASP.NET Web API

我使用Unity作为我的IoC容器,使用 Automapper 进行OO映射。

我的DataAccess图层引用包含所有数据对象的模型层。

我不想在我的Api图层中引用我的模型项目。因此,从服务层返回DomainObjects(业务模型)并映射到API层中的DTO(DTO位于API层中)。

我在API层中将domainModel配置为DTO映射,如下所示

public static class MapperConfig
{
    public static void Configure() {
        Mapper.Initialize(
            config => {
                config.CreateMap<StateModel, StateDto>();
                config.CreateMap<StateDto, StateModel>();

                //can't do this as I do not have reference for State which is in MyApp.Model
                //config.CreateMap<State, StateModel>();
                //config.CreateMap<StateModel, State>();
            });
    }
}

现在我的问题是如何配置我的自动映射器映射以将我的实体模型转换为域模型?

要在我的API层中执行操作,我没有引用我的模型项目。我相信我应该在服务层执行此操作但不确定如何执行此操作。请帮助您如何配置此映射。

注意:在问这里之前我用眼睛搜索了

  1. Where to place AutoMapper map registration in referenced dll说要使用静态构造函数,我觉得这不是一个很好的选择,可以添加到我的所有模型中(我有100个模型)而另一个答案说要使用PreApplicationStartMethod,我必须添加引用到System.web.dll到我的服务是不正确的。

  2. https://groups.google.com/forum/#!topic/automapper-users/TNgj9VHGjwg也没有正确回答我的问题。

1 个答案:

答案 0 :(得分:0)

您需要在每个图层项目中创建映射profiles,然后告诉AutoMapper在引用所有较低层的最顶层/最顶层(调用)层中使用这些配置文件。在您的示例中:

  

MyApp.Model

public class ModelMappingProfile : AutoMapper.Profile
{
    public ModelMappingProfile()
    {
        CreateMap<StateModel, StateDto>();
        CreateMap<StateDto, StateModel>();
    }
}
  

MyApp.Api

public class ApiMappingProfile : AutoMapper.Profile
{
    public ApiMappingProfile()
    {
        CreateMap<State, StateModel>();
        CreateMap<StateModel, State>();
    }
}
  

MyApp.Services

Mapper.Initialize(cfg => 
{
    cfg.AddProfile<MyApp.Model.ModelMappingProfile>();
    cfg.AddProfile<MyApp.Model.ApiMappingProfile>();
});

,或者如果您使用的是DI容器(例如SimpleInjector):

container.RegisterSingleton<IMapper>(() => new Mapper(new MapperConfiguration(cfg => 
{
    cfg.AddProfile<MyApp.Model.ModelMappingProfile>();
    cfg.AddProfile<MyApp.Model.ApiMappingProfile>();
})));