我在我的项目中定义了一个全局的Automapper配置,允许我Mapper.Map<targetType>(sourceObject);
在我的代码中使用.(参见下面的配置.)
我更新了NuGet包,我看到了Mapper.Map已经过时/折旧的消息.我在GitHub上回到Automapper,看到这样的例子:
[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");
}
Run Code Online (Sandbox Code Playgroud)
我是否必须在使用映射的EVERY方法中创建配置?
我目前的全局配置:
namespace PublicationSystem.App_Start
{
public class AutoMapperConfig
{
public static void CreateMaps()
{
CreateProjectMaps();
}
private static void CreateProjectMaps()
{
Mapper.CreateMap<Project, ProjectCreate>();
Mapper.CreateMap<Project, ProjectSelectable>();
//...
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:感谢Scott Chamberlain的一些指导,我创建了一个这样的课程:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我想我应该在我的BaseController类中使用'MapperConfiguration'.我开始做这样的事情:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我是在正确的轨道上吗?
小智 39
这就是我处理它的方式.
在Profile中创建地图,注意使用Profile的CreateMap方法而不是Mapper的同名静态方法:
internal class MappingProfile : Profile
{
protected override void Configure()
{
CreateMap<Project, ProjectCreate>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在依赖关系被连接的任何地方(例如:Global.asax或Startup),创建MapperConfiguration,然后使用它来创建IMapper.
var mapperConfiguration = new MapperConfiguration(cfg =>
{
cfg.AddProfile(new MappingProfile());
});
Run Code Online (Sandbox Code Playgroud)
然后,使用配置生成IMapper:
var mapper = mapperConfiguration.CreateMapper();
Run Code Online (Sandbox Code Playgroud)
然后,使用依赖关系构建器注册该映射器(我在这里使用Autofac)
builder.RegisterInstance(mapper).As<IMapper>();
Run Code Online (Sandbox Code Playgroud)
现在,无论你需要映射什么东西,都要声明对IMapper的依赖:
internal class ProjectService : IProjectService {
private readonly IMapper _mapper;
public ProjectService(IMapper mapper) {
_mapper = mapper;
}
public ProjectCreate Get(string key) {
var project = GetProjectSomehow(key);
return _mapper.Map<Project, ProjectCreate>(project);
}
}
Run Code Online (Sandbox Code Playgroud)
zqu*_*ngz 11
我正在使用5.2.0版,支持在构造函数中创建映射而不是覆盖配置.
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Project, ProjectDto>();
}
}
Run Code Online (Sandbox Code Playgroud)
在Global.asax.cs中调用如下:
Mapper.Initialize(c=>c.AddProfile<MappingProfile>());
Run Code Online (Sandbox Code Playgroud)
希望这有帮助.
这是AutoMapper 4.2中的新功能.有关Jimmy Bogard的博客文章:从AutoMapper中删除静态API.它声称
IMapper接口要轻得多,底层类型现在只关心执行映射,消除了很多线程问题......
新语法:(从博客文章粘贴)
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<User, UserDto>();
});
Run Code Online (Sandbox Code Playgroud)
如果你只是想要这样做的"老方法".最新版本4.2.1带来了一些传统.只是用
CreateMap<Project, ProjectCreate>();
Run Code Online (Sandbox Code Playgroud)
代替
Mapper.CreateMap<Project, ProjectCreate>();
Run Code Online (Sandbox Code Playgroud)
旧代码可以正常工作.
归档时间: |
|
查看次数: |
44459 次 |
最近记录: |