How to inject AutoMapper IMappingEngine with StructureMap

前端 未结 4 1176
生来不讨喜
生来不讨喜 2020-12-31 05:58

Most of the examples I\'ve found for Automapper use the static Mapper object for managing type mappings. For my project, I need to inject an IMapperEngine as part of object

相关标签:
4条回答
  • 2020-12-31 06:10

    The Mapper class has a static property Mapper.Engine. Use this to register the engine with the container:

    For<IMappingEngine>().Use(() => Mapper.Engine);
    

    If you need to load your profiles before injecting the engine I would insert that configuration code alongside the above snippet.


    Update

    Your custom registry would look like this

    class MyRegistry : Registry
    {
      public MyRegistry()
      {
        For<IMyRepository>().Use<MyRepository>();
        For<ILogger>().Use<Logger>();
    
        Mapper.AddProfile(new AutoMapperProfile());
        For<IMappingEngine>().Use(() => Mapper.Engine);
      }
    }
    

    This code runs once in your bootstrapper and any dependency of type IMappingEngine will afterwards be served with the value of the static property Mapper.Engine which is configured using your custom AutoMapperProfile.

    0 讨论(0)
  • 2020-12-31 06:19

    I wrote a blog post that shows my AutoMapper with StructureMap setup. I have created specific registries for AutoMapper 3.1.0 (also works for 3.1.1) and 3.0.0 and 2.2.1.

    http://www.martijnburgers.net/post/2013/12/20/My-AutoMapper-setup-for-StructureMap.aspx

    0 讨论(0)
  • 2020-12-31 06:19

    Here's what I ended up with as I couldn't figure out how to set the configuration on Mapper.Engine and have it passed into For().Use.

    public MyRegistry()
    {
        For<IMyRepository>().Use<MyRepository>();
        For<ILogger>().Use<Logger>();
    
        //type mapping
        For<ConfigurationStore>()
            .Singleton()
            .Use(ctx =>
            {
                ITypeMapFactory factory = ctx.GetInstance<ITypeMapFactory>();
                ConfigurationStore store 
                    = new ConfigurationStore(factory, MapperRegistry.AllMappers());
                IConfiguration cfg = store;
                cfg.AddProfile<MyAutoMapperProfile>();
                store.AssertConfigurationIsValid();
                return store;
            });
        For<IConfigurationProvider>().Use(ctx => ctx.GetInstance<ConfigurationStore>());
        For<IConfiguration>().Use(ctx => ctx.GetInstance<ConfigurationStore>());
        For<IMappingEngine>().Singleton().Use<MappingEngine>();
        For<ITypeMapFactory>().Use<TypeMapFactory>();
    }
    
    0 讨论(0)
  • 2020-12-31 06:30

    The static API will be removed in version 5.0. Use a MapperConfiguration instance and store statically as needed. Use CreateMapper to create a mapper instance.

    in new version (4.2.0 >=) we should hold and pass IMapper through DI.

    a simple Configure Service should be like this (ASP.NET Core)

    services.AddSingleton<IMapper>(_ => new MapperConfiguration(cfg =>
                {
                    cfg.CreateMap<Foo,Bar>();
                })
                .CreateMapper());
    

    and our service layer (with the help of constructor injection) :

    public class CrudService<TDocument> : ICrudService<TDocument>
        {
            private readonly IMapper _internalMapper;
            private readonly IRepository<TDocument> _repository;
    
            public CrudService(IRepository<TDocument> repository, IMapper mapper)                
            {
                _internalMapper = mapper;
                _repository = repository;
            }
    
            public virtual ServiceResult<string> Create<TModel>(TModel foo)
            {
                var bar = _internalMapper.Map<TDocument>(foo);
    
                try
                {
                    _repository.Create(bar);
                }
                catch (Exception ex)
                {
                    return ServiceResult<string>.Exception(ex);
                }
    
                return ServiceResult<string>.Okay(entity.Id);
            }
    }
    

    consider TDocument as Bar, and TModel as Foo


    update :
    AutoMapper 4.2.1 released – Static is back

    After a bit of feedback and soul searching and honestly tired of dealing with questions, some of the static API is restored in this release. You can now (and in the future) use Mapper.Initialize and Mapper.Map

    0 讨论(0)
提交回复
热议问题