在父对象内映射子对象

时间:2012-08-26 19:59:49

标签: c# mapping

我有点问题。我不太清楚如何处理这种情况所以我只是解释一个简化的场景,希望你能帮助我。

我正在尝试将父数据库对象映射到父bll对象。在这个父数据库对象中,有一个外键指向子ID,在我的父bll对象中,我使用了子bll对象(不仅包含一个ID)。

所以这是我的bll对象:

public class Parent
{
    public int ID { get; set; }
    public Child Child { get; set; }
}

public class Child
{
    public int ID { get; set; }
    public string FirstName { get; set; }
}

这是我的mapper类/方法:

public class ParentMapper
{
    public Parent MapFromSource(ParentDatabaseObject parentDO)
    {
        Parent parent = new Parent();
        parent.ID = parentDO.ID;
        parent.Child = ???;
        return parent;
    }
}

我不认为在这种情况下ParentDatabaseObject的外观非常重要,我只想知道如何映射parent.Child对象。

我考虑过以下事项:

parent.Child = new Child();
parent.Child.ID = doParent.Child.Id;
parent.Child.FirstName = doParent.Child.FirstName;

哪种感觉不对,'因为我有把它放在我的ChildMapper中的冲动,这导致我实现这个的第二种方式(假设我有一个单独的子映射器并且有一个叫它的实例childMapper):

parent.Child = childMapper.MapFromSource(parentDO.Child);

但我有种感觉,使用这种映射方式会使我的代码紧密耦合,因为我将在ParentMapper中使用我的ChildMapper。

所以我想我的问题是:我应该如何实现这种映射。这最后一种方法是正确的还是有更好的东西?我已经放弃了我尝试的第一件事。

感谢您的帮助!

(我在发布这个问题之前做了研究,这是我能找到的最接近的: Data Mapper for Child Objects,但我并不满足于那里唯一的答案。

1 个答案:

答案 0 :(得分:0)

不应该更好 -

parent.Child = childMapper.MapFromSource(parentDO.FoeignKeyToTheChild);  

我认为你应该有通过Id获取对象的方法。

编辑:如果你的映射器没有DataAccess代码,那么你必须在Repository内映射孩子。由于您的Repository已准备好DataObjects,您可以通过以下方式执行此操作 -

ParentMapper:

public class ParentMapper
{
    public Parent MapFromSource(ParentDo parentDo)
    {
        Parent parent = new Parent();
        parent.Id = parentDo.Id;
        return parent;
    }
}  

ChildMapper:

public class ChildMapper
{
    public Child MapFromSource(ChildDo childDo)
    {
        Child child = new Child();
        child.Id = childDo.Id;
        child.FirstName = childDo.FirstName;

        return child;
    }
}  

存储库:

public class Repository
{
    //you already have parentDo
    //you already have childDo

    public Parent GetParent()
    {
        Parent parent = parentMapper.MapFromSource(parentDo);
        parent.Child = childMapper.MapFromSource(childDo);
        return parent;
    }

    public Child GetChild()
    {
        Child child = childMapper.MapFromSource(childDo);
        return child;
    }
}  

否则,您的Mapper必须能够访问DataAccess代码。