Automapper和Windsor的问题

GUZ*_*GUZ 5 asp.net-mvc castle-windsor automapper

当我尝试使用依赖注入的自定义解析器时,我遇到了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; }
}
Run Code Online (Sandbox Code Playgroud)

和以下视图模型:

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

    public int CountryId { get; set; }

    public IEnumerable<Country> Countries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

为了映射我使用以下代码:

Mapper.Map(registrationViewModel, user);
Run Code Online (Sandbox Code Playgroud)

我之前注册以下内容:

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);
      });
Run Code Online (Sandbox Code Playgroud)

我的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))
           );

    }
}
Run Code Online (Sandbox Code Playgroud)

自定义解析程序按以下方式完成:

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

}
Run Code Online (Sandbox Code Playgroud)

运行映射代码时,我得到以下异常:

AutoMapper.AutoMapperMappingException:尝试将ViewModels.RegistrationViewModel映射到Models.User.使用ViewModels.RegistrationViewModel到Models.User的映射配置抛出了类型'AutoMapper.AutoMapperMappingException'的异常.----> AutoMapper.AutoMapperMappingException:尝试将ViewModels.RegistrationViewModel映射到LModels.Country.使用ViewModels.RegistrationViewModel到Models.User的映射配置目标属性:Country抛出了类型'AutoMapper.AutoMapperMappingException'的异常.----> System.ArgumentException:类型'Mapping.LoadingEntityResolver`1 [Models.Country]'没有默认构造函数

我不知道可能出错了什么.它可能是构建解析器的东西.当我尝试以下时没有问题:

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

Assert.IsInstanceOf<LoadingEntityResolver<Country>>(resolver);
Run Code Online (Sandbox Code Playgroud)

我会很乐意为你提供帮助.

最好的问候
卢卡斯

Dar*_*rov 4

这里有一些相当大的 DI 东西:-) 我会避免让 AutoMapper 从数据库或其他东西解析实体。使代码难以理解,并且跟踪对象的生命周期可能会成为一场噩梦。

无论如何,要解决您的问题,只需交换顺序(错误):

Mapper.Initialize(x =>
{
    x.AddProfile<BasicProfile>();
    x.ConstructServicesUsing(container.Resolve);
});
Run Code Online (Sandbox Code Playgroud)

纠正):

Mapper.Initialize(x =>
{
    x.ConstructServicesUsing(container.Resolve);
    x.AddProfile<BasicProfile>();
});
Run Code Online (Sandbox Code Playgroud)