2011-06-21 48 views
5

當我嘗試使用使用依賴注入的自定義解析器時,Automapper出現問題。Automapper和Windsor問題

我有以下模式:

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

較早的I寄存器如下:

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

我對任何幫助都非常滿意。

問候
盧卡斯

回答

4

你有一些相當豐厚的DI的東西會在這裏:-)我將避免從數據庫或任何具有AutoMapper決心實體。使代碼難以理解,並且下面的對象可能會變成一場噩夢。

總之,要解決您的問題簡單地從交換(錯誤的)順序:

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

到(正確):

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

非常感謝您的幫助。這個簡單的改變解決了我的問題如果您認爲我使用的方法不好 - 那麼您建議如何? – GUZ