Configuring Automapper in N-Layer application
Asked Answered
P

1

6

I have an N-Layer application as shown below

MyApp.Model - contains edmx and data models

MyApp.DataAccess - Repositories with EF

MyApp.Domain - Domain/business models

MyApp.Services - services(class library)

MyApp.Api - ASP.NET Web API

I am using Unity as my IoC container and Automapper for OO mapping.

My DataAccess layer references Model layer which contains all my Data objects.

I do not want to refer my model project in my Api layer. So returning DomainObjects (business models) from service layer and mapping to DTOs in API layer(DTOs are in API layer).

I configured domainModel to DTO mapping in API layer as below

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>();
            });
    }
}

Now my question is how/where to configure my auto mapper mappings to convert my Entity models to Domain models?

To do in my API layer I do not have reference to my model project. I believe I should do this in service layer but not sure how to do that. Please help how to configure this mapping.

Note: Before asking here I googled with all eyes

  1. Where to place AutoMapper map registration in referenced dll says to use static constructor which I do not think a good option to add in all my models (I have 100 models) and another answer says to use PreApplicationStartMethod for which I have to add reference to System.web.dll to my services which is not correct.

  2. https://groups.google.com/forum/#!topic/automapper-users/TNgj9VHGjwg also did not answer my question properly.

Psoas answered 1/6, 2018 at 3:7 Comment(6)
"Entity models" → You only mentioned that once, how would we know?Croydon
docs.automapper.org/en/stable/…Aretha
@Croydon sry. "Entity models" are the classes in MyApp.Model project created by edmx generator.Psoas
@LucianBargaoanu thanks for your link will give a try and get back to you.Psoas
@LucianBargaoanu How does that help?Multifaceted
That page explains how you configure AM in an app that uses modules that need AM.Aretha
M
4

You need to create mapping profiles in each of your layer projects, then tell AutoMapper to use those profiles in the topmost/outermost (invoking) layer that references all the lower layers. In your example:

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>();
});

or if you are using a DI container (e.g. SimpleInjector):

container.RegisterSingleton<IMapper>(() => new Mapper(new MapperConfiguration(cfg => 
{
    cfg.AddProfile<MyApp.Model.ModelMappingProfile>();
    cfg.AddProfile<MyApp.Model.ApiMappingProfile>();
})));
Multifaceted answered 31/7, 2018 at 6:17 Comment(1)
And probing is built in now, so that would be the simplest way. Of course you can let the DI container do that.Aretha

© 2022 - 2024 — McMap. All rights reserved.