I had defined in my project a global Automapper configuration that would allow me to use Mapper.Map<targetType>(sourceObject);
in my code. (See my configuration below.)
I updated the NuGet package, and I see the message that Mapper.Map is obsolete/depreciated. I went back to Automapper on GitHub and see examples like this:
[Test]
public void Example()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source1, SubDest1>().FixRootDest();
cfg.CreateMap<Source2, SubDest2>().FixRootDest();
});
config.AssertConfigurationIsValid();
var mapper = config.CreateMapper();
var subDest1 = mapper.Map<Source1, SubDest1>(new Source1 {SomeValue = "Value1"});
var subDest2 = mapper.Map<Source2, SubDest2>(new Source2 {SomeOtherValue = "Value2"});
subDest1.SomeValue.ShouldEqual("Value1");
subDest2.SomeOtherValue.ShouldEqual("Value2");
}
Am I going to have to create a configuration in EVERY method that uses a mapping?
My current global configuration:
namespace PublicationSystem.App_Start
{
public class AutoMapperConfig
{
public static void CreateMaps()
{
CreateProjectMaps();
}
private static void CreateProjectMaps()
{
Mapper.CreateMap<Project, ProjectCreate>();
Mapper.CreateMap<Project, ProjectSelectable>();
//...
}
}
}
UPDATE: Thanks to some coaching from Scott Chamberlain I have created a class like this:
public class MkpMapperProfile : AutoMapper.Profile
{
protected override void Configure()
{
this.CreateMap<Project, ProjectCreate>();
this.CreateMap<Project, ProjectSelectable>();
this.CreateMap<Project, ProjectDetails>();
// Many Many other maps
}
}
I'm thinking I should have the 'MapperConfiguration' in my BaseController class. I started to do something like this:
public partial class BaseController : Controller
{
private MapperConfiguration mapConfig;
public BaseController()
{
db = new MkpContext();
SetMapperConfig();
}
private void SetMapperConfig()
{
mapConfig = new MapperConfiguration(cfg =>
{
cfg.AddProfile<MkpMapperProfile>();
});
}
public BaseController(MapperConfiguration config)
{
db = new MkpContext();
this.mapConfig = config;
}
}
Am I on the right track?
I'm using version 5.2.0, support to create maps in constructors instead of override configure.
In Global.asax.cs call like:
Hope this help.
You can find configured AutoMapper 4.2 in my ASP.NET MVC Template project here: https://github.com/NikolayIT/ASP.NET-MVC-Template
Create these classes: https://github.com/NikolayIT/ASP.NET-MVC-Template/tree/master/ASP.NET%20MVC%205/Web/MvcTemplate.Web.Infrastructure/Mapping
Annotate view models with
IMapFrom<>
: https://github.com/NikolayIT/ASP.NET-MVC-Template/blob/master/ASP.NET%20Core/Web/AspNetCoreTemplate.Web/ViewModels/Settings/SettingViewModel.csUse it as
.To<SomeViewModel>()
. Example: https://github.com/NikolayIT/ASP.NET-MVC-Template/blob/master/ASP.NET%20MVC%205/Web/MvcTemplate.Web/Controllers/HomeController.cs#L27This is new in AutoMapper 4.2. There is a blog post by Jimmy Bogard on this: Removing the static API from AutoMapper. It claims that
The new syntax: (pasted from the blog post)
If you just want the "old way" of doing this. The latest version 4.2.1 has brought back some tradition. Just use
instead of
The old code will work just fine.
This is how I've handled it.
Create maps in a Profile, taking care to use the Profile's CreateMap method rather than Mapper's static method of the same name:
Then, wherever dependencies are wired-up (ex: Global.asax or Startup), create a MapperConfiguration and then use it to create an IMapper.
Then, use the configuration to generate an IMapper:
Then, register that mapper with the dependency builder (I'm using Autofac here)
Now, wherever you need to map stuff, declare a dependency on IMapper: