Не удается разрешить AutoMapper.IMapper с использованием AutoMapper 4.2 с Autofac

Я пробовал различные варианты этого, но моя текущая конфигурация (в том, что касается AutoMapper) выглядит следующим образом:

builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile)).As<Profile>();

builder.Register(c => new MapperConfiguration(cfg =>
{
    foreach (var profile in c.Resolve<IEnumerable<Profile>>())
    {
        cfg.AddProfile(profile);
    }
})).AsSelf().SingleInstance();


builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();

builder.RegisterType<MappingEngine>().As<IMappingEngine>();

У меня есть конструктор, использующий IMapper mapperОднако я продолжаю получать YSOD:

None of the constructors found with'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'
on type '' can be invoked with the available services and parameters:
 Cannot resolve parameter 'AutoMapper.IMapper mapper' of constructor 
'Void .ctor(...,...,..., AutoMapper.IMapper)'.

Этот класс прекрасно работает без ссылки на автомаппер, поэтому я уверен, что проблема заключается в моей конфигурации автомаппера.

Я не уверен, что мне здесь не хватает, так как я очень плохо знаком с AutoFac и AutoMapper.

Редактировать:

Я также попробовал:

builder.Register(c => new MapperConfiguration(cfg =>
{
    cfg.CreateMap<IdentityUser, AspNetUser>().ReverseMap();
})).AsSelf().SingleInstance();

builder.Register(ctx => ctx.Resolve<MapperConfiguration>().CreateMapper()).As<IMapper>();
//I've tried both of these lines separately, neither work
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();

Я также попытался вручную добавить профили в соответствии с предложением в комментариях

2 ответа

Решение

Как я уже упоминал в комментарии, ваш код AutoFac представляется правильным (за исключением части сканирования сборки).

Я создал следующее тестовое приложение, и оно действительно работает без каких-либо исключений и помещает 3 в окно вывода (как и предполагалось):

using System.Diagnostics;
using Autofac;
using AutoMapper;

namespace Sandbox
{
    public partial class App
    {
        public App()
        {
            var builder = new ContainerBuilder();
            builder.Register(
                c => new MapperConfiguration(cfg =>
                {
                    cfg.AddProfile(new TestProfile());
                }))
                .AsSelf()
                .SingleInstance();

            builder.Register(
                c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve))
                .As<IMapper>()
                .InstancePerLifetimeScope();

            builder.RegisterType<MappingEngine>()
                .As<IMappingEngine>();

            builder.RegisterType<Test>().AsSelf();

            var container = builder.Build();
            container.Resolve<Test>();
        }
    }

    public class TestProfile : Profile
    {
        protected override void Configure()
        {
            CreateMap<Source, Destination>();
        }
    }

    public class Test
    {
        public Test(IMapper mapper)
        {
            var source = new Source { Id = 3 };
            var destination = mapper.Map<Destination>(source);
            Debug.Print(destination.Id.ToString());
        }
    }

    public class Source
    {
        public int Id { get; set; }
    }

    public class Destination
    {
        public int Id { get; set; }
    }
}

Я бы посоветовал создать новую ветку вашего приложения в управлении версиями и убирать вещи, пока они не заработают.

Это сработало для меня...

       builder = new ContainerBuilder();
        builder.Register(
            c => new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new TestProfile());
            }))
            .AsSelf()
            .SingleInstance();

        builder.Register(
            c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve))
            .As<IMapper>()
            .InstancePerLifetimeScope();

        builder.RegisterType<MappingEngine>()
            .As<IMappingEngine>();

        builder.RegisterType<Test>().AsSelf();

        var container = builder.Build();
        container.Resolve<Test>();
Другие вопросы по тегам