1

我正在将 Mapster 与 DI 一起使用,并且我正在尝试映射从 WS 接收到的对象。我正在关注本指南https://github.com/MapsterMapper/Mapster/wiki/Dependency-Injection#mapping

我注册了 TypeAdapterConfig 和 ServiceMapper

var config = new TypeAdapterConfig();
services.AddSingleton(config);
services.AddScoped<IMapper, ServiceMapper>();

黑名单类包含卡片集合,但 web 服务返回长数组,我将其重新映射到对象。

public class BlacklistMapper : IRegister
{
    void IRegister.Register(TypeAdapterConfig config)
    {
        config.NewConfig<long, Internal.BlacklistCard>()
            .Map(dest => dest.Cuid, source => source);

        config.NewConfig<SzWebService.BlackList, Internal.Blacklist>()
            .Map(dest => dest.Id, source => source.iBlacklistId)
            .Map(dest => dest.Crc, source => source.iBlackListCRC)
            .Map(dest => dest.Cards, source => source.lCuid);
    }
}

在构造函数中注入映射器

 private readonly IMapper _mapper;

 public Service(IMapper mapper)
 {
     _logger = logger;
 }

最后这样称呼它

_mapper.Map<Blacklist>(response.mBlackListData)

结果始终是具有默认值的对象

4

1 回答 1

2

第 1 步 - 通过实施创建配置IRegister

public class BlacklistMapper : IRegister
{
    void Register(TypeAdapterConfig config)
    {
        config.NewConfig<SzWebService.BlackList, Internal.Blacklist>()
            .Map(...)
            .Map(...);
    }
}

第 2 步 - 注册配置

您可以显式注册配置:

var config = new TypeAdapterConfig();

// Explicitly apply a specific configuration
config.Apply(new BlackListMapper());

services.AddSingleton(config);
services.AddScoped<IMapper, ServiceMapper>();

或者让 Mapster 扫描您的程序集以获取IRegister实现:

// Scan & apply IRegisters automatically.
config.Scan(Assembly.GetExecutingAssembly()); 
于 2022-01-05T14:45:03.923 回答