建议如何映射业务实体和数据实体

时间:2015-03-18 10:11:42

标签: c# mapping

我想将我的业务数据实体从我的数据库数据实体中解耦,这样使我的应用程序更加“数据源独立”,并以这种方式切换数据源所有我需要做的事情是为新数据源创建一些新的存储库。

但是,我无法决定如何进行映射。 我当前的数据源是来自Parse.com的“数据库”,在我第一次尝试进行映射时,我使用的是AutoMapper。

如果我的实体有自己的参考,该怎么办?或者如果其中一个“子实体”有一个引用回到它的父级(如EF那样)会怎么样?

Class ParentClass
{
    public string Name { get;set }
    public IEnumerable<ChildClass> Children { get;set; }
}

Class ChildClass
{
    public string Name { get;set }
    public ParentClass Parent{ get;set; }
}

我认为如果我对它进行映射,它会以循环结束吗?

我遇到的另一个问题是,如果例如Child会有一些非常深的引用属性呢?

让我们假设ChildClass看起来像这样

Class ChildClass
{
    public string Name { get;set }
    public ParentClass Parent { get;set; }
    public IEnumerable<ChildClass> Children { get;set; }
}

我知道这可能是一个愚蠢的例子,但在这种情况下,一个ChildClass对象可以对一群孩子有一个非常深入的引用,这些孩子可能有一堆孩子等等。

如果我使用AutoMapper进行映射,我最终会实际映射所有这些孩子,直到没有孩子留下来映射。但是,如果我实际上并不需要所有的“子孩子”呢?

有没有办法让孩子们在财产上使用“懒加载”?

举个例子:

myParentObject.Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault()

这会导致Children属性仅在“通话中”加载

有关如何将数据实体映射到业务实体的任何建议吗?

我认为我实际上正在寻找的东西可以使自定义业务实体的处理方式与实体框架处理其实体的方式相同。

1 个答案:

答案 0 :(得分:0)

您的存储库可以返回简单的poco dto对象(是的,我知道&#34; o&#34;在poco和dto中已经代表&#34; object&#34;)。 Theese不需要像父母的反向链接那样复杂。它们只是等级的。掌握详细清单等。有些人提到了一些查找。如果两个对象指向同一个查找对象而您无法设法使它们相同,那么您可能会遇到麻烦。身份地图模式http://en.wikipedia.org/wiki/Identity_map_pattern或值对象模式http://en.wikipedia.org/wiki/Value_object在此处提供帮助。 现在你的Mapper可以在一个自己的assemlby中引用你的业务实体和dtos。因此,您的业务实体和dtos不需要彼此了解。通过这种方式,您可以获得最大的解耦和独立性。 对于每个用例,您的存储库应该是不同的,并且应该&#34;知道&#34;哪个数据需要哪个深度并相应地加载它。没有万能的&#34; ContactReposiory&#34;即使在所有用例中都不需要,它也总是加载地址。并且不要在生产中使用延迟加载。你最终可能会遇到很多(性能)问题。 (遍历两个小的foreach可能会在数据库往返的第1000次结束)。 如果适合至少容易的部件,您的映射器可以使用automapper。你可以手工实施复杂的部分。