如何将值传递给自定义ValueResolver

本文关键字:自定义 ValueResolver 值传 | 更新日期: 2023-09-27 18:24:55

我很难处理将值传递给自定义ValueResolver的格式。我基本上是在尝试基于我的ViewModel将Int转换为Object。然而,我无法让它将值传递给我的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传递值的正确语法方向吗?

感谢

更新:

基本上是想写这样的东西:

  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…

如何将值传递给自定义ValueResolver

的方法

如果我理解正确,我认为您可能会使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);
        }

自定义解析程序:

public class CustomResolver : ValueResolver<CreateContainerViewModel, Container>
{
    protected override Container ResolveCore(CreateContainerViewModel source)
    {
            return new Container() { ID = source.ID };  
    }
}