Проблема с Automapper и Windsor

У меня проблема с Automapper, когда я пытаюсь использовать настраиваемый преобразователь, который использует внедрение зависимостей.

У меня есть следующая модель:

public class User : Entity
{
    public virtual string Name { get; set; }
    public virtual Country Country { get; set; }
}

public class Country : Entity
{
    public virtual string Name { get; set; }
}

и следующая модель представления:

public class RegistrationViewModel
{
    [Required]        
    public string Name { get; set; }

    public int CountryId { get; set; }

    public IEnumerable<Country> Countries { get; set; }
}

для отображения я использую следующий код:

Mapper.Map(registrationViewModel, user);

ранее я регистрирую следующее:

Mapper.Reset();
container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<ISession>().
                               UsingFactoryMethod(() => NHibernateSessionFactory.RetrieveSession()).
                               LifeStyle.Is(LifestyleType.Transient));
container.Register(Component.For(typeof(LoadingEntityResolver<>)).ImplementedBy(typeof(LoadingEntityResolver<>)).LifeStyle.Transient);
 Mapper.Initialize(x =>
      {
           x.AddProfile<BasicProfile>();
           x.ConstructServicesUsing(container.Resolve);
      });

Мой BasicProfile следующий:

public class BasicProfile : Profile
{
    public const string VIEW_MODEL = "MyBasicProfile";

    public override string ProfileName
    {
        get { return VIEW_MODEL; }
    }

    protected override void Configure()
    {
        CreateMaps();
    }

    private void CreateMaps()
    {
        CreateMap<RegistrationViewModel, User>()
           .ForMember(dest => dest.Country, _ => _.ResolveUsing<LoadingEntityResolver<Country>>().FromMember(src => src.CountryId))
           );

    }
}

Пользовательский преобразователь выполняется следующим образом:

public class LoadingEntityResolver<TEntity> : ValueResolver<int, TEntity>
    where TEntity: Entity
{
    private readonly ISession _session;

    public LoadingEntityResolver(ISession session)
    {
        _session = session;
    }

   protected override TEntity ResolveCore(int source)
   {
       return _session.Load<TEntity>(source);
   }

}

Когда выполняется код сопоставления, я получаю следующее исключение :

AutoMapper.AutoMapperMappingException: Попытка сопоставить ViewModels.RegistrationViewModel с Models.User. Использование конфигурации сопоставления для ViewModels.RegistrationViewModel на Models.User Возникло исключение типа «AutoMapper.AutoMapperMappingException». ----> AutoMapper.AutoMapperMappingException: попытка сопоставить ViewModels.RegistrationViewModel с LModels.Country. Использование конфигурации сопоставления для ViewModels.RegistrationViewModel на Models.User Место назначения: Страна Возникло исключение типа AutoMapper.AutoMapperMappingException. ----> System.ArgumentException: Тип 'Mapping.LoadingEntityResolver`1 [Models.Country]' не имеет конструктора по умолчанию

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

var resolver = container.Resolve<LoadingEntityResolver<Country>>();

Assert.IsInstanceOf<LoadingEntityResolver<Country>>(resolver);

Я был бы рад любой помощи.

С уважением
Лукаш

5
задан GUZ 21 June 2011 в 10:12
поделиться