Asp*_*net 25 c# asp.net automapper
https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API
这个改变打破了我的系统.
在更新之前,我使用:
===> Startup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
...
MyAutoMapperConfiguration.Configure();
}
}
Run Code Online (Sandbox Code Playgroud)
===> MyAutoMapperConfiguration.cs
public class MyAutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(a =>
{
a.AddProfile<AbcMappingProfile>();
a.AddProfile<XyzMappingProfile>();
a.AddProfile<QweMappingProfile>();
});
}
}
Run Code Online (Sandbox Code Playgroud)
===> AbcMappingProfile.cs
public class AbcMappingProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<AbcEditViewModel, Abc>();
Mapper.CreateMap<Abc, AbcEditViewModel>();
...
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
'Mapper.CreateMap()'已过时:'静态API将在5.0版中删除.使用MapperConfiguration实例并根据需要静态存储.使用CreateMapper创建一个映射器实例.
我可以使用Mapper.Map.现在我该如何使用它
Nik*_*nte 46
代替:
Mapper.CreateMap<AbcEditViewModel, Abc>();
Run Code Online (Sandbox Code Playgroud)
新语法是:
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<AbcEditViewModel, Abc>();
});
Run Code Online (Sandbox Code Playgroud)
然后:
IMapper mapper = config.CreateMapper();
var source = new AbcEditViewModel();
var dest = mapper.Map<AbcEditViewModel, Abct>(source);
Run Code Online (Sandbox Code Playgroud)
(有更多例子的来源)
而不是Automapper Profile使用IMapperConfigurationExpression扩展:
映射配置:
public static class AutoMapperConfig
{
public static IMapperConfigurationExpression AddAdminMapping(
this IMapperConfigurationExpression configurationExpression)
{
configurationExpression.CreateMap<Job, JobRow>()
.ForMember(x => x.StartedOnDateTime, o => o.PreCondition(p => p.StartedOnDateTimeUtc.HasValue))
.ForMember(x => x.StartedOnDateTime, o => o.MapFrom(p => p.StartedOnDateTimeUtc.Value.DateTime.ToLocalTime()))
.ForMember(x => x.FinishedOnDateTime, o => o.PreCondition(p => p.FinishedOnDateTimeUtc.HasValue))
.ForMember(x => x.FinishedOnDateTime, o => o.MapFrom(p => p.FinishedOnDateTimeUtc.Value.DateTime.ToLocalTime()));
return configurationExpression;
}
}
Run Code Online (Sandbox Code Playgroud)
集成(Startup.cs等):
var mappingConfig = new AutoMapper.MapperConfiguration(cfg =>
{
cfg.AddAdminMapping();
});
services.AddSingleton(x => mappingConfig.CreateMapper());
Run Code Online (Sandbox Code Playgroud)
依赖注入给我的遗留项目增加了整体的复杂性,我只是不想处理它。由于同一个库被许多不同的技术调用,Webforms、MVC、Azure Service 等......
另外,依赖注入会迫使我重写几个方法或传递 IMapper。
所以我只是逆向工程了它在 8.0 中所做的事情并为其编写了一个包装器。
public static class MapperWrapper
{
private const string InvalidOperationMessage = "Mapper not initialized. Call Initialize with appropriate configuration. If you are trying to use mapper instances through a container or otherwise, make sure you do not have any calls to the static Mapper.Map methods, and if you're using ProjectTo or UseAsDataSource extension methods, make sure you pass in the appropriate IConfigurationProvider instance.";
private const string AlreadyInitialized = "Mapper already initialized. You must call Initialize once per application domain/process.";
private static IConfigurationProvider _configuration;
private static IMapper _instance;
private static IConfigurationProvider Configuration
{
get => _configuration ?? throw new InvalidOperationException(InvalidOperationMessage);
set => _configuration = (_configuration == null) ? value : throw new InvalidOperationException(AlreadyInitialized);
}
public static IMapper Mapper
{
get => _instance ?? throw new InvalidOperationException(InvalidOperationMessage);
private set => _instance = value;
}
public static void Initialize(Action<IMapperConfigurationExpression> config)
{
Initialize(new MapperConfiguration(config));
}
public static void Initialize(MapperConfiguration config)
{
Configuration = config;
Mapper = Configuration.CreateMapper();
}
public static void AssertConfigurationIsValid() => Configuration.AssertConfigurationIsValid();
}
Run Code Online (Sandbox Code Playgroud)
就像在以前的版本中一样初始化它
public static class AutoMapperConfig
{
public static void Configure()
{
MapperWrapper.Initialize(cfg =>
{
cfg.CreateMap<Foo1, Foo2>();
});
MapperWrapper.AssertConfigurationIsValid();
}
}
Run Code Online (Sandbox Code Playgroud)
只需在您的启动中调用它即可(Global.asax 等..)
AutoMapperConfig.Configure();
Run Code Online (Sandbox Code Playgroud)
然后您所要做的就是在所有静态调用之前添加 MapperWrapper 。一切都像以前一样进行。
MapperWrapper.Mapper.Map<Foo2>(Foo1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24059 次 |
| 最近记录: |