Gia*_*tti 5 c# asp.net automapper aspnetboilerplate
我是 ASP.NET BoilerPlate (ABP) 的新手,我试图了解如何使用 AutoMapper 创建自定义映射,也许还有 ABP 自动映射器属性:AutoMap、AutoMapFrom、AutoMapTo。
使用 ABP,我可以通过这种方式映射两个类:
[AutoMapTo(typeof(DestClass)]
public class SourceClass {
public string A { get; set; }
public string B { get; set; }
}
public class DestClass {
public string A { get; set; }
public string B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我有如下两个类,我希望属性 AB 自动映射为 A 和 B 的联接:
[AutoMapTo(typeof(DestClass)]
public class SourceClass {
public string A { get; set; }
public string B { get; set; }
}
public class DestClass {
public string AB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
ABP 有一些属性吗?或者我是否需要使用“经典”AutoMapper 代码:
Mapper.CreateMap<SourceClass, DestClass>()
.ForMember(dest => dest.AB,
opts => opts.MapFrom(src => (src.A + ", " + src.B)));
Run Code Online (Sandbox Code Playgroud)
我必须在哪里放置这样的初始化代码?
我找到了一个解决方案,我在这里分享。
public class MyProjectAutoMapperProfile : AutoMapper.Profile {
protected override void Configure() {
CreateMap<SourceClass, DestClass>()
.ForMember(dest => dest.AB,
opts => opts.MapFrom(src => (src.A + ", " + src.B)));
// other customs here...
}
Run Code Online (Sandbox Code Playgroud)
[DependsOn(typeof(MyProjectCoreModule), typeof(AbpAutoMapperModule))]
public class MyProjectApplicationModule : AbpModule
{
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
// --- MY CODE for registering custom automapping
var mapperConfiguration = new MapperConfiguration(cfg => {
cfg.AddProfile(new MyProjectMapperProfile()); // <= here my custom mapping
});
var mapper = mapperConfiguration.CreateMapper();
IocManager.IocContainer.Register(
Castle.MicroKernel.Registration.Component.For<IMapper>().Instance(mapper)
);
// --- MY CODE
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我直接使用了 Castle IOC 注册方法,因为我在 ABP 中没有找到任何有用的对象注册方法。你认识一个吗?
public class MyAppService : MyNewHouseAppServiceBase, IMyAppService {
// ...
public MyAppService(IRepository<SourceClass, long> myRepository, AutoMapper.IMapper mapper) {
_myRepo = myRepository;
_mapper = mypper;
}
public async Task<DestClass> GetSource(long id) {
var source = await _myRepo.Find(id);
// USE THE INJECTED MAPPER
return _mapper.Map<DestClass>(source);
}
public async Task<ListResultOutput<DestClass>> GetSources() {
var sources = await _myRepo.GetAllListAsync();
return new ListResultOutput<DestClass>(
// USE THE INJECTED MAPPER
_mapper.Map<List<DestClass>>(sources)
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7510 次 |
| 最近记录: |