gpt4 book ai didi

c# - 使用 AutoMapper 在构造函数中注入(inject)父类映射子类

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

我有以下类结构:

class SrcChild
{
public bool SomeProperty { get; set; }
}

class SrcParent
{
public IEnumerable<SrcChild> Children { get; set; }
}

所以 SrcParent 有一个 SrcChild 对象的集合。

现在我想将 SrcParent 的一个实例映射到 DstParent。以下是目标类:

class DstChild
{
public bool SomeProperty { get; set; }

public DstChild(DstParent parent)
{
if (parent == null)
throw new ArgumentNullException();
}
}

class DstParent
{
public IEnumerable<DstChild> Children { get; set; }
}

DstParent 有一组 DstChild 对象,它们使用构造函数注入(inject)来保持对其父对象的引用。

使用 AutoMapper,我尝试了以下操作:

class Program
{
static void Main(string[] args)
{
/* mapping configuration */
Mapper.CreateMap<SrcChild, DstChild>()
.ConstructUsing(
resolutionContext => new DstChild((DstParent)resolutionContext.Parent.DestinationValue));
Mapper.CreateMap<SrcParent, DstParent>();

/* source parent object with two children */
var srcParent = new SrcParent
{
Children = new[] { new SrcChild(), new SrcChild() }
};

/* throws an exception */
var dstParent = Mapper.Map<DstParent>(srcParent);

Console.ReadKey();
}
}

这里的主要部分是 AutoMapper 配置,我试图从映射上下文中提取对生成的 DstParent 的引用。这不起作用((DstParent)resolutionContext.Parent.DestinationValue 为空),但也许我在这里完全遗漏了一点?

我的另一个想法是使用一个函数来创建子值,如下所示:

class Program
{
/* Should produce value for DstParent.Children */
private static IEnumerable<DstChild> MakeChildren(SrcParent src /*, DstParent dstParent */)
{
var result = new List<DstChild>();
// result.Add(new DstChild(dstParent));
return result;
}

static void Main(string[] args)
{
/* mapping configuration */
Mapper.CreateMap<SrcChild, DstChild>();
Mapper.CreateMap<SrcParent, DstParent>()
.ForMember(dst => dst.Children,
opt => opt.MapFrom(src => MakeChildren(src /*, How to obtain a reference to the destination here? */)));

/* source parent object with two children */
var srcParent = new SrcParent
{
Children = new[] { new SrcChild(), new SrcChild() }
};

var dstParent = Mapper.Map<DstParent>(srcParent);

Console.ReadKey();
}
}

但我不知道如何(如果可能的话)获取对 Mapper 生成的 DstParent 对象的引用。

有没有人知道如何做到这一点,或者我应该考虑完全放弃这个设计并摆脱父引用?提前致谢。

最佳答案

好吧,我找到的解决方案并不漂亮,但它有效:

class Program
{
static IEnumerable<DstChild> MakeChildren(IEnumerable<SrcChild> srcChildren, DstParent dstParent)
{
var dstChildren = new List<DstChild>();
foreach (SrcChild child in srcChildren)
{
var dstChild = new DstChild(dstParent);
Mapper.Map(child, dstChild);
dstChildren.Add(dstChild);
}
return dstChildren;
}

static void Main(string[] args)
{
Mapper.CreateMap<SrcChild, DstChild>();
Mapper.CreateMap<SrcParent, DstParent>()
/* Ignore Children property when creating DstParent*/
.ForMember(dst => dst.Children, opt => opt.Ignore())
/* After mapping is complete, populate the Children property */
.AfterMap((srcParent, dstParent) =>
{
dstParent.Children = MakeChildren(srcParent.Children, dstParent);
});

var source = new SrcParent
{
Children = new[]
{
new SrcChild() {SomeProperty = true},
new SrcChild() {SomeProperty = false}
}
};

var destination = Mapper.Map<DstParent>(source);

Console.ReadKey();
}
}

目的地已初始化子项,并由 AutoMapper 正确分配 SomeProperty。如果您找到更好看的解决方案,请告诉我。

关于c# - 使用 AutoMapper 在构造函数中注入(inject)父类映射子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290431/

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