Collections 使用AutoMapper映射只读子集合

Collections 使用AutoMapper映射只读子集合,collections,automapper,Collections,Automapper,这不是一个问题,因为我已经找到了一种方法来做我想做的事情,但似乎应该有更好的方法来做。我到处找了,什么也没找到 基本上,我有一个非常标准的对象模型。 public class Parent { private readonly IList<Child> _children = new List<Child>(); public IEnumerable<Child> Children { get { return _children; } }

这不是一个问题,因为我已经找到了一种方法来做我想做的事情,但似乎应该有更好的方法来做。我到处找了,什么也没找到

基本上,我有一个非常标准的对象模型。

public class Parent
{
    private readonly IList<Child> _children = new List<Child>();
    public IEnumerable<Child> Children { get { return _children; } }
    public void AddChild(Child child)
    {
        child.Parent = this;
        _children.Add(child);
    }
}
(为了清晰起见,我省略了与问题、错误检查和保护无关的属性…)

我使用方法将子对象添加到集合中的原因是为了维护对添加子对象时需要处理的业务逻辑的控制

标准映射为:

Mapper.CreateMap<Parent, ParentDTO>();
Mapper.CreateMap<ParentDTO, Parent>();
Mapper.CreateMap<Child, ChildDTO>();
Mapper.CreateMap<ChildDTO, Child>();
这符合我的要求。然而,我忍不住觉得必须有更好的方法,而且我还没有用一个现有的父母测试过这一点,他们修改了孩子,可能添加了或删除了孩子,所以我知道这实际上还不正确。最终,这个域模型是使用NHibernate持久化的,所以我不得不担心这一点。但是,一次只能做一件事。:)


希望这可以帮助遇到同样问题的其他人,也可能是正确解决了问题的人能够纠正我。

我认为,如果出于良好的业务逻辑原因保护财产,那么如果AutoMapper在进行映射时绕过这些问题,那将是不好的。在这种情况下,我宁愿放弃流畅的语法,将创建逻辑放在自己的方法中,如下所示:

private Parent MapParentDTOToParent(ParentDTO source)
{
    var parent = new Parent();
    // Business logic here
    return parent
}
然后:

Mapper.CreateMap<ParentDTO, Parent>().ConvertUsing(MapParentDTOToParent);
Mapper.CreateMap().ConvertUsing(MapParentDtoParent);

我发现这比有很多忽略声明更容易理解。

我不喜欢在属性getter或setter中包含逻辑,但如何将setter添加到父类的Children属性中呢

public class Parent
{
    private readonly IList<Child> _children = new List<Child>();

    public IEnumerable<Child> Children
    {
        get => _children;
        set => AddChildren(value);
    }

    public void AddChild(Child child)
    {
        child.Parent = this;
        _children.Add(child);
    }

    private void AddChildren(IEnumerable<Child> children)
    {
        _children.Clear();

        foreach (var child in children)
        {
            AddChild(child);
        }
    }
}
公共类父类
{
私有只读IList_children=新列表();
可数儿童的公共教育
{
get=>\u儿童;
set=>AddChildren(值);
}
公共无效添加子对象(子对象)
{
child.Parent=this;
_添加(child);
}
私有子对象(IEnumerable children)
{
_儿童。清除();
foreach(儿童中的儿童变量)
{
AddChild(child);
}
}
}
而后置图逻辑也不太必要。映射配置将很简单

Mapper.CreateMap<ParentDTO, Parent>();
Mapper.CreateMap();

+1您的aftermap解决方案救了我。很酷的解决方案。我会借用它:-)使用AfterMap的好主意。使用源对象和目标对象要比使用ResolutionResult之类的东西容易得多!
private Parent MapParentDTOToParent(ParentDTO source)
{
    var parent = new Parent();
    // Business logic here
    return parent
}
Mapper.CreateMap<ParentDTO, Parent>().ConvertUsing(MapParentDTOToParent);
public class Parent
{
    private readonly IList<Child> _children = new List<Child>();

    public IEnumerable<Child> Children
    {
        get => _children;
        set => AddChildren(value);
    }

    public void AddChild(Child child)
    {
        child.Parent = this;
        _children.Add(child);
    }

    private void AddChildren(IEnumerable<Child> children)
    {
        _children.Clear();

        foreach (var child in children)
        {
            AddChild(child);
        }
    }
}
Mapper.CreateMap<ParentDTO, Parent>();