2016-02-22 1 views
4

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

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)'. 

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

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

Edit:

Я также попытался:

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(); 

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

+0

Что произойдет, если вы временно добавите свои профили вручную вместо использования 'IEnumerable '? – devuxer

+0

@devuxer см. Мое обновление. Это тоже не работает :( – Eonasdan

+0

Я думаю, что ваш код сканирования сборки может быть не совсем прав, но я пробовал остальную часть вашего кода в тестовом приложении, и он отлично работает. Поэтому что-то еще должно вызывать проблему. вы разместили точку останова на линии, где вы регистрируете свой «IMapper», чтобы убедиться, что на самом деле он попал? – devuxer

ответ

7

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

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

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; } 
    } 
} 

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

+1

Хотя не совсем ответ, у меня было два региона в Startup, один для autofac и один для automapper. Builder.Build() был скрыт, и я полностью мозг пугал не двигая его. Ваш ответ посмотреть где-то, кроме AutoMapper, заставил меня понять это. – Eonasdan

+0

Рад, что я мог каким-то образом помочь :) – devuxer

+0

Есть ли причина, по которой IMapper не зарегистрирован как SingleInstance в вашем примере? – m0s

Смежные вопросы