代码之家  ›  专栏  ›  技术社区  ›  MatterOfFact

告诉注入的automapper在map函数中使用特定的映射配置文件

  •  0
  • MatterOfFact  · 技术社区  · 7 年前

    在某些情况下,我的一个应用程序服务必须为前端生成带有匿名数据的DTO。其思想是使用不同的automapper配置文件将域对象映射到映射了所有属性的dto,或者使用匿名的dto。 我生成了这两个配置文件并将它们注入到服务中。automapper也作为 IMapper 并包含应用程序的所有映射配置文件。

    我现在需要的是告诉映射器在调用map函数时使用一个特定的配置文件。 像这样的:

    var anonymizedDto = _autoMapper.Map<SourceType, DestinationType> 
        (sourceObject, ops => ops.UseMappingProfile(_anonymizedMapingProfile));
    
    var normalDto = _autoMapper.Map<SourceType, DestinationType>
        (sourceObject, ops => ops.UseMappingProfile(_normalMappingProfile));
    

    这可能吗?如果可能的话:怎么做?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Georg Patscheider    7 年前

    据我所知,你打电话时不能更改个人资料 Map .

    您可以做的是插入两个已经配置了不同配置文件的映射程序。

    public class MyService : IService {
    
       private readonly IMappingEngine _defaultMapper;
       private readonly IMappingEngine _anonymousMapper;
    
       public MyService(IMappingEngine defaultMapper, IMappingEngine anonymousMapper) {
           _defaultMapper = defaultMapper;
           _anonymousMapper = anonymousMapper;
       }
    
       public MyDto GetDefault() {
           return _defaultMapper.Map<MyDto>(sourceObject);
       }
    
       public MyDto GetAnonymous() {
           return _anonymousMapper.Map<MyDto>(sourceObject);
       }
    }
    

    在依赖项容器中,设置构造函数注入以尊重ctor参数的名称。例如 StructureMap :

    public void ConfigureAutoMappers(ConfigurationExpression x) {
    
        // register default mapper (static mapping configuration)
        Mapper.Configuration.ConstructServicesUsing(t => container.GetInstance(t));
        Mapper.Configuration.AddProfile<DefaultProfile>();
        var defaultAutomapper = Mapper.Engine
        x.For<IMappingEngine>().Use(() => defaultAutoMapper).Named("DefaultAutoMapper");
    
        // register anonymous mapper
        var anonConfig = new AnonConfigurationStore( // class derived from ConfigurationStore
            new TypeMapFactory(), 
            AutoMapper.Mappers.MapperRegistry.AllMappers()
        ); 
        anonConfig.ConstructServicesUsing(container.GetInstance);
        var anonAutoMapper = new MappingEngine(anonConfig);
        x.For<IMappingEngine>().Add(anonAutoMapper).Named("AnonAutoMapper");
    
        // Inject the two different mappers into our service
        x.For<IService>().Use<MyService>()
            .Ctor<IMappingEngine>("defaultMapper").Named("DefaultAutoMapper")
            .Ctor<IMappingEngine>("anonymousMapper").Named("AnonAutoMapper");
    }