Castle Windsor не разрешает профили AutoMapper после обновления - PullRequest
1 голос
/ 18 декабря 2011

Все работало нормально, пока я не обновил с помощью NuGet ссылки на CastleWinsor и AutoMapper до их последних версий: Castle.Windsor.3.0.0.4001 и AutoMapper.2.0.0.

У меня есть список профилей AutoMapper в той же сборке, что и AutoMapperInstaller : IWindsorInstaller. Они находятся в разных пространствах имен, но это не должно иметь значения, верно?

Вот пример профиля:

namespace FieldService.Web.Mappings
{
 public class RoleMappings : Profile
 {
    protected override void Configure()
    {
        AutoMapper.Mapper.CreateMap<RoleModel, Role>()
            .ConstructUsing((role) => new Role() { Permissions = new List<Permission>() })
            .ForMember(m => m.Permissions, o => o.MapFrom(src => src.Permissions.Where(p => p.Selected == true)));
    }
 }
}

Вот это AutoMapperInstaller

namespace FieldService.Web.Infrastructure.IOC
{
 public class AutoMapperInstaller : IWindsorInstaller
 {
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        Mapper.Initialize(x => x.ConstructServicesUsing(container.Resolve));

        RegisterProfilesAndResolvers(container);
        RegisterMapperEngine(container);
    }

    private void RegisterMapperEngine(IWindsorContainer container)
    {
        container.Register(
            Component.For<IMappingEngine>().Instance(Mapper.Engine)
        );
    }

    private void RegisterProfilesAndResolvers(IWindsorContainer container)
    {
        // register value resolvers
        container.Register(AllTypes.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn<IValueResolver>());

        // register profiles
        container.Register(AllTypes.FromThisAssembly().BasedOn<Profile>());
        var profiles = container.ResolveAll<Profile>();

        foreach (var profile in profiles)
            Mapper.AddProfile(profile);
    }
 }
}

В Global.asax у меня есть метод BootstrapContainer, который я вызываю из Application_Start метод:

private static readonly IWindsorContainer container = new WindsorContainer();

    public IWindsorContainer Container
    {
        get { return container; }
    }

    private static void BootstrapContainer()
    {
        container.Install(FromAssembly.This());
    }

Исключение, которое я получаю: Trying to map xxx to yyyModel. Missing type map configuration or unsupported mapping. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.

Я отладил установщик и думаю, что эта строка Container.Register(AllTypes.FromThisAssembly().BasedOn<Profile>()); больше не работает.

Если я пытаюсь разрешить профили (следующая строка), возвращается 0 профилей.

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

Есть идеи, почему это больше не работает?

1 Ответ

2 голосов
/ 18 декабря 2011

Это известное и задокументированное критическое изменение в Виндзоре (подробности см. breakingchanges.txt).

Короче говоря, если вы разрешаете свои профили как Profile, вам нужно зарегистрировать их как Profile.

Container.Register(AllTypes.FromThisAssembly().BasedOn<Profile>().WithServiceBase());
...