【问题标题】:How can I pass parameters to an AutoMapper Profile in ABP?如何将参数传递给 ABP 中的 AutoMapper 配置文件?
【发布时间】:2022-07-06 23:23:44
【问题描述】:

我需要自定义 MyAutoMapper 配置文件将我的对象映射到 DTO 的方式。在我的一个 ApplicationServices 中,我使用 ObjectMapper 进行相对简单的映射。问题是 ABP 的 AutoMapper 并不是大家都知道的普通 AutoMapper。

下面是理想情况下的 sn-p;除了 opt.MapFrom(m => Localizer[m.Type.ToString()])_objectMapper.Map<Preparation, DtoPreparation>(preparation, _localizer) 不能那样工作。

public class MyAutoMapperProfile : Profile
{
    public MyAutoMapperProfile()
    {
        CreateMap<Preparation, DtoPreparation>()
            .ForMember(m => m.PreparatorType, opt => opt.MapFrom(m => m.Type))
            .ForMember(m => m.PreparatorTypeString, opt => opt.MapFrom(m => Localizer[m.Type.ToString()]));
    }
}

public class SlipsAppService : TaxesAppService
{
    private readonly IObjectMapper<TaxesApplicationModule> _objectMapper;
    private readonly ISlipsManager _slipsManager;
    private readonly IStringLocalizer<TaxesResource> _localizer;

    public SlipsAppService(ISlipsManager iSlipsManager, IObjectMapper<TaxesApplicationModule> objectMapper, IStringLocalizer<TaxesResource> localizer)
    {
        _objectMapper = objectMapper;
        _slipsManager = iSlipsManager;
        _localizer = localizer;
    }

    [Microsoft.AspNetCore.Mvc.HttpPost("/api/slips/get-or-create-preparation")]
    public async Task<DtoPreparation> GetOrCreateCurrentPreparation(BaseGetterInput input)
    {
        var preparation = await _slipsManager.GetOrCreatePreparation(input.Id);
        return _objectMapper.Map<Preparation, DtoPreparation>(preparation, _localizer);
    }
}

我找不到将任何信息从我的 ApplicationService 传递到 AutoMapper 配置文件的方法,因为 IObjectMapper.Map&lt;&gt;() 没有用于其他选项或对象的参数,这与普通 AutoMapper 不同。

也许有一种方法可以在依赖注入中注册 Profile,但是由于我对框架的了解有限,我找不到线索...

目前,我的问题仅在于本地化,但实际上它可以应用于任何事情。由于我的 DTO 包含其他嵌套的 DTO,因此管理 AutoMapper 之外的额外内容不是一种选择,除非我更改应用程序的结构只是为了解决问题。

【问题讨论】:

  • 如果 ABP 框架的抽象不支持您想要的功能,您可以将其转换为 AutoMapper 对象。
  • 铸造不起作用,因为 IObjectMapper 不直接继承 AutoMapper 的 IMapper,但是我能够通过对 AutoMapper 的引用替换我对 Volo.Abp.ObjectMapping 的引用,而无需更改我的个人资料。跨度>

标签: c# automapper abp


【解决方案1】:

由于您为每个应用服务使用一个映射配置文件,因此这是一个适合我的好建议:

  • 创建一个实现 IMappingAction 接口的类。
  • 在 Process 方法的实现中,注入您的 ILocalizer 并将其与源和目标一起使用。
  • 在您的映射中,不要传递定位器,而是使用 AfterMap 进行链式调用。

这是一个例子:


public class MyAutoMapperProfile : Profile
{
    public MyAutoMapperProfile()
    {
        CreateMap<Preparation, DtoPreparation>()
            .ForMember(m => m.PreparatorType, opt => opt.MapFrom(m => m.Type))
            .AfterMap<PreparationDtoLocalizerAction>;
    }
}

public class PreparationDtoLocalizerAction : IMappingAction<Preparation, DtoPreparation>
{
    private readonly IStringLocalizer<TaxesResource> _localizer;

    public PreparationDtoLocalizerAction(IStringLocalizer<TaxesResource> localizer)
    {
        _localizer = localizer;
    }

    public void Process(Preparation source, DtoPreparation destination)
    {
        destination.PreparatorTypeString = _localizer[source.Type.ToString()]
    }
}

public class SlipsAppService : TaxesAppService
{
    private readonly IObjectMapper<TaxesApplicationModule> _objectMapper;
    private readonly ISlipsManager _slipsManager;

    public SlipsAppService(ISlipsManager iSlipsManager, IObjectMapper<TaxesApplicationModule> objectMapper)
    {
        _objectMapper = objectMapper;
        _slipsManager = iSlipsManager;
    }

    [Microsoft.AspNetCore.Mvc.HttpPost("/api/slips/get-or-create-preparation")]
    public async Task<DtoPreparation> GetOrCreateCurrentPreparation(BaseGetterInput input)
    {
        var preparation = await _slipsManager.GetOrCreatePreparation(input.Id);
        return _objectMapper.Map<Preparation, DtoPreparation>(preparation);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多