gpt4 book ai didi

c# - 使用 asp.net 样板和 Automapper 进行自定义映射

转载 作者:太空狗 更新时间:2023-10-30 01:32:24 29 4
gpt4 key购买 nike

我是 ASP.NET BoilerPlate (ABP) 的新手,我正在尝试了解如何使用 AutoMapper 创建自定义映射,也许还有 ABP automapper 属性: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; }
}

但是如果我有如下两个类,我希望将属性 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; }
}

ABP有一些属性吗?还是我需要使用“经典的”AutoMapper 代码:

Mapper.CreateMap<SourceClass, DestClass>()
.ForMember(dest => dest.AB,
opts => opts.MapFrom(src => (src.A + ", " + src.B)));

我必须在哪里放置这样的初始化代码?

最佳答案

我找到了一个解决方案,我在这里分享。

  1. 在“MyProject.Application”项目中,我定义了我的自动映射器习惯(我使用了配置文件):
   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...
}
  1. 然后我在类 MyProjectApplicationModule 的 Initialize 方法中注册它用于注入(inject):
    [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
}
}

注意我直接使用了CaSTLe IOC的注册方法,因为我在ABP中没有找到有用的对象注册方法。你认识一个吗?

  1. 最后,我将我的自定义映射用作我的应用程序服务中的注入(inject)并直接使用它:
    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)
);
}
}

关于c# - 使用 asp.net 样板和 Automapper 进行自定义映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37344741/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com