Automapper和Windsor的问题

时间:2011-06-21 10:12:23

标签: 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; }
}

以及以下视图模型:

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”类型的异常。     ----&GT; AutoMapper.AutoMapperMappingException:尝试将ViewModels.RegistrationViewModel映射到LModels.Country。   使用ViewModels.RegistrationViewModel到Models.User的映射配置   目的地财产:国家   抛出了“AutoMapper.AutoMapperMappingException”类型的异常。     ----&GT; System.ArgumentException:类型'Mapping.LoadingEntityResolver`1 [Models.Country]'没有默认构造函数

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

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

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

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

最好的问候 卢卡斯

1 个答案:

答案 0 :(得分:4)

你有一些非常沉重的DI东西:-)我会避免让AutoMapper从数据库或其他任何东西解析实体。使代码难以理解,跟随对象的生命周期可能成为一场噩梦。

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

Mapper.Initialize(x =>
{
    x.AddProfile<BasicProfile>();
    x.ConstructServicesUsing(container.Resolve);
});

到(正确):

Mapper.Initialize(x =>
{
    x.ConstructServicesUsing(container.Resolve);
    x.AddProfile<BasicProfile>();
});