C# 替换静态自动映射API;替换配置文件中的映射方法
我正在替换静态AutoMapper API: 所以,在我有一个C# 替换静态自动映射API;替换配置文件中的映射方法,c#,automapper,C#,Automapper,我正在替换静态AutoMapper API: 所以,在我有一个档案之前像: public class DigitalResourceProfile : AutoMapper.Profile { protected override void Configure() { AutoMapper.Mapper.CreateMap<DTO, Domain>(); AutoMapper.Mapper.CreateMap<Domain, D
档案之前
像:
public class DigitalResourceProfile : AutoMapper.Profile
{
protected override void Configure()
{
AutoMapper.Mapper.CreateMap<DTO, Domain>();
AutoMapper.Mapper.CreateMap<Domain, DTO>()
.ForMember(dst => dst.Attachs, opts => opts.MapFrom(src => AutoMapper.Mapper.Map<List<AttachDomain>, List<AttachDTO>>(src.Attachs)))
.ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));
AutoMapper.Mapper.CreateMap<AttachDTO, AttachDomain>();
AutoMapper.Mapper.CreateMap<AttachDomain, AttachDTO>()
.ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));
}
}
公共类DigitalResourceProfile:AutoMapper.Profile
{
受保护的覆盖无效配置()
{
AutoMapper.Mapper.CreateMap();
AutoMapper.Mapper.CreateMap()
.FormMember(dst=>dst.Attachs,opts=>opts.MapFrom(src=>AutoMapper.Mapper.Map(src.Attachs)))
.ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime());
AutoMapper.Mapper.CreateMap();
AutoMapper.Mapper.CreateMap()
.ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime());
}
}
从现在起,此配置文件类如下所示:
public class DigitalResourceProfile : AutoMapper.Profile
{
protected override void Configure()
{
this.CreateMap<DTO, Domain>();
this.CreateMap<Domain, DTO>()
>>>>>>>>>>>>>>>>>.ForMember(dst => dst.Attachs, opts => opts.MapFrom(src => AutoMapper.Mapper.Map<List<AttachDomain>, List<AttachDTO>>(src.Attachs)))
.ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));
this.CreateMap<AttachDTO, AttachDomain>();
this.CreateMap<AttachDomain, AttachDTO>()
.ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));
}
}
公共类DigitalResourceProfile:AutoMapper.Profile
{
受保护的覆盖无效配置()
{
这个.CreateMap();
这个
>>>>>>>>>>>>>>>>>.FormMember(dst=>dst.Attachs,opts=>opts.MapFrom(src=>AutoMapper.Mapper.Map(src.Attachs)))
.ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime());
这个.CreateMap();
这个
.ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime());
}
}
但是,我不知道如何替换.formmember(dst=>dst.Attachs,opts=>opts.MapFrom(src=>AutoMapper.Mapper.Map(src.Attachs))
有什么想法吗?不使用静态API,您可以将映射引擎传递给概要文件构造函数 您将在下面找到一个使用Unity的单元测试
[TestClass]
public class UnitTest1
{
public class TestA
{
public TestC valueA { get; set; }
}
public class TestB
{
public TestD valueB { get; set; }
}
public class TestC
{
public string value { get; set; }
}
public class TestD
{
public string value { get; set; }
}
private readonly IUnityContainer appContainer = new UnityContainer();
public sealed class MappingConfiguration : Profile
{
private readonly IMappingEngine mappingEngine;
// Inject mapping engine through constructor
public MappingConfiguration(IMappingEngine mappingEngine)
: base()
{
this.mappingEngine = mappingEngine;
}
protected override void Configure()
{
CreateMap<TestA, TestB>()
.ForMember(dest => dest.valueB, o => o.ResolveUsing(src =>
this.mappingEngine.Mapper.Map<TestD>(src.valueA)));
CreateMap<TestC, TestD>();
}
}
[TestMethod]
public void MappingTest()
{
// AutoMapper configuration
var config = new MapperConfiguration(cfg =>
{
cfg.ConstructServicesUsing(type => appContainer.Resolve(type));
});
var mapper = config.CreateMapper();
appContainer.RegisterInstance<IConfiguration>(config);
appContainer.RegisterType<IMappingEngine, MappingEngine>(new InjectionConstructor(config, mapper));
appContainer.Resolve<IConfiguration>().AddProfile(new MappingConfiguration(appContainer.Resolve<IMappingEngine>()));
// Check config
mapper.ConfigurationProvider.AssertConfigurationIsValid();
var testIn = new TestA { valueA = new TestC { value = "This is a test" } };
var result = mapper.Map<TestB>(testIn);
}
}
[TestClass]
公共类UnitTest1
{
公共类遗嘱
{
public TestC valueA{get;set;}
}
公共类TestB
{
公共TestD valueB{get;set;}
}
公共类TestC
{
公共字符串值{get;set;}
}
公共类TestD
{
公共字符串值{get;set;}
}
私有只读IUnityContainer appContainer=new UnityContainer();
公共密封类映射配置:配置文件
{
专用只读IMappingEngine映射引擎;
//通过构造函数注入映射引擎
公共映射配置(IMappingEngine映射引擎)
:base()
{
this.mappingEngine=mappingEngine;
}
受保护的覆盖无效配置()
{
CreateMap()
.ForMember(dest=>dest.valueB,o=>o.ResolveUsing(src=>
this.mappingEngine.Mapper.Map(src.valueA));
CreateMap();
}
}
[测试方法]
公共void映射测试()
{
//自动映射配置
var config=new-MapperConfiguration(cfg=>
{
ConstructServicesUsing(type=>appContainer.Resolve(type));
});
var mapper=config.CreateMapper();
appContainer.RegisterInstance(配置);
RegisterType(新的InjectionConstructor(config,mapper));
appContainer.Resolve().AddProfile(新的映射配置(appContainer.Resolve());
//检查配置
mapper.ConfigurationProvider.AssertConfigurationsValid();
var testIn=newtesta{valueA=newtestc{value=“这是一个测试”};
var result=mapper.Map(testIn);
}
}
您是否找到了一种不使用静态API从概要文件调用Map()方法的方法?很遗憾,还没有。谢谢您的帮助。但是为什么要将配置和映射引擎添加到IOC容器中?我采用了类似的方法,但创建了这两个类的实例,然后将IMapper添加到IOC容器中。