2012-02-15 57 views
2

我正在努力將值傳遞給自定義ValueResolver的格式。我基本上試圖將Int轉換爲基於我的ViewModel的對象。但是,我不能得到它的價值將它傳遞給我的ValueResolver如何將值傳遞給自定義ValueResolver?

我有以下的自定義ValueResolver:

public class CustomResolver : ValueResolver<CreateContainerViewModel, Container> 
{ 
    private int id = 0; 

    public CustomResolver(int? sourceId) 
    { 
     if(sourceId.HasValue) 
      id = sourceId.Value; 
    } 
    protected override Container ResolveCore(CreateContainerViewModel source) 
    { 
     if (id == 0) return null; 
     else 
     { 
      ISession _session = DependencyResolver.Current.GetService<ISessionFactory>().GetCurrentSession(); 
      return _session.Get<Container>(id); 
     } 
    } 
} 

當我創建使用硬編碼INT類似下面的代碼

地圖它工作正常
Mapper.CreateMap<CreateContainerViewModel, Container>() 
.ForMember(a => a.CurrentContainer, opt => opt.ResolveUsing(src => new CustomResolver(33))); 

,但它不工作(投擲映射除外),當我嘗試從我的視圖模型中獲得的價值

Mapper.CreateMap<CreateContainerViewModel, Container>() 
      .ForMember(dest => dest.CurrentContainer, opt => opt.MapFrom(src => new CustomResolver(src.CurrentContainerId))); 

任何人都可以指向正確語法的方向,將值傳遞給自定義ValueResolver嗎?

感謝

UPDATE:

基本上嘗試寫這樣的事:

public class IdToObjectResolver<T> : ValueResolver<int, T> where T : class 
{ 
    private ISession _session; 
    private int id; 
    public IdToObjectResolver(Nullable<int> sourceId) 
    { 
     _session = DependencyResolver.Current.GetService<ISessionFactory>().GetCurrentSession(); 
     if(sourceId.HasValue) 
      id = sourceId.Value; 
    } 

    protected override T ResolveCore(int source) 
    { 
     return _session.Get<T>(source); 
    } 
} 

此代碼犯規目前是有意義的,但只是想傳遞的int類型的方式。 ..

+0

本頁面http://automapper.codeplex.com/wikipage?title=Custom%20Value% 20Resolvers說自定義提供給解析器的源值 - 即將推出:) – TomL 2012-02-15 16:20:49

+0

[.ForMember(dest => dest.SomePropA,opt => opt.ResolveUsing ().FromMember(SRC => src.propA))] [1] [1]:http://stackoverflow.com/questions/5368525/automapper-using-the-structure-returned- by-a-custom-resolver – 2014-07-17 13:17:00

回答

0

如果我理解正確,我認爲你可能會過度複雜化ValueResolver一點。如您所見,整個CreateContainerViewModel類都是通過ValueResolver中的ResolveCore方法發送的。這將是具有值的整個源對象。

因此,您應該能夠使用此映射從源對象中獲取id值:opt.ResolveUsing(src => new CustomResolver())。 (沒有構造函數arg)。

希望這會有所幫助。

編輯:

我的測試:

 [TestMethod] 
     public void TestMethod1() 
     { 
      Mapper.CreateMap<CreateContainerViewModel, Container>() 
       .ForMember(a => a.CurrentContainer, opt => opt.ResolveUsing<CustomResolver>()); 


      var source = new CreateContainerViewModel() 
      { 
       ID = 3 
      }; 

      var destination = new Container(); 

      Mapper.Map(source, destination); 

      Assert.AreEqual(destination.CurrentContainer.ID, 3); 

     } 

CustomResolver:

public class CustomResolver : ValueResolver<CreateContainerViewModel, Container> 
{ 
    protected override Container ResolveCore(CreateContainerViewModel source) 
    { 

      return new Container() { ID = source.ID }; 
    } 
} 
+0

謝謝@dtryon。我實際上正在嘗試開發一個更通用的解決方案,用於將外鍵id字段解析到我的域中的對象中。雖然發佈的解決方案將工作,我將不得不爲每個外鍵對象創建新的自定義解析器 - 我希望能夠開發一個通用的解決方案,允許我從被映射的對象的屬性傳入id – TomL 2012-02-17 13:33:07

+0

我有用我想要實現的例子更新了我的原始問題 – TomL 2012-02-17 13:36:46

+0

好吧,我想我必須誤解。然而,即使在新的例子中,哪個對象是來自'sourceId'的?源對象或目標對象還是兩者都不? – 2012-02-17 15:00:28

相關問題