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)
我会很乐意为你提供帮助.
最好的问候
卢卡斯
这里有一些相当大的 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)
| 归档时间: |
|
| 查看次数: |
1122 次 |
| 最近记录: |