2012-02-15 54 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

相关问题