gpt4 book ai didi

c# - 如何将值传递给自定义 ValueResolver?

转载 作者:行者123 更新时间:2023-11-30 18:01:12 27 4
gpt4 key购买 nike

我正在努力处理将值传递给自定义 ValueResolver 的格式。我基本上是在尝试根据我的 ViewModel 将 Int 转换为 Object。但是,我无法让它将值传递给我的 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 创建 map 时,它工作正常,如下面的代码

Mapper.CreateMap<CreateContainerViewModel, Container>()
.ForMember(a => a.CurrentContainer, opt => opt.ResolveUsing(src => new CustomResolver(33)));

但是当我尝试从我的 View 模型中获取值时它不起作用(抛出映射异常)

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 复杂化了一点。如您所见,整个 CreateContainerViewModel 类在 ValueResolver 的 ResolveCore 方法中发送。这将是具有值的整个源对象。

因此,您应该能够使用此映射从源对象中提取 id 值:opt.ResolveUsing(src => new CustomResolver())。 (没有构造函数参数)。

希望这对您有所帮助。

编辑:

我的测试:

        [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 };
}
}

关于c# - 如何将值传递给自定义 ValueResolver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com