【问题标题】:Suggestion of how to map business entities and data entities关于如何映射业务实体和数据实体的建议
【发布时间】:2015-03-18 19:00:15
【问题描述】:

我想将我的业务数据实体与我的数据库数据实体分离,这样可以使我的应用程序更加“独立于数据源”,并且通过这种方式切换数据源,我需要做的只是是为新数据源创建一些新的存储库。

但是,我无法完全确定如何进行映射。 我当前的数据源是来自 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; }
}

我假设如果我把它映射起来,它会以一个循环结束?

我遇到的另一个问题是,如果 Children 有一些非常深的参考属性怎么办?

让我们假设 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 属性仅“随叫随到”加载

关于如何将数据实体映射到业务实体有什么建议吗?

我假设我真正在寻找的东西可以让自定义业务实体的处理方式与实体框架处理其实体的方式相同。

【问题讨论】:

    标签: c# mapping


    【解决方案1】:

    您的存储库可以返回简单的 poco dto 对象(是的,我知道 poco 中的“o”并且 dto 已经代表“object”)。 Theese 不需要像反向链接那样复杂。它们只是分层的。掌握详细信息列表等。有些引用了一些查找。如果两个对象指向同一个查找对象并且您无法使它们相同,那么您可能会遇到麻烦。身份映射模式http://en.wikipedia.org/wiki/Identity_map_pattern 或值对象模式http://en.wikipedia.org/wiki/Value_object 在这里提供帮助。 现在您的 Mapper 可以在一个引用您的业务实体和 dto 的自己的程序集中。因此,您的业务实体和 dto 无需相互了解。这样你就有了最大的解耦和独立性。 对于每个用例,您的存储库应该是不同的,并且应该“知道”需要哪些数据到哪个深度并相应地加载它。没有万能的“ContactReposiory”,即使在所有用例中都不需要时也总是加载地址。并且不要在生产中使用延迟加载。你最终可能会遇到很多(性能)问题。 (用两个 litte foreach 遍历可能会在第 1000 次数据库往返中结束)。 如果至少适用于简单的部分,您的映射器可以使用 automapper。您可以手动实现的复杂部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2015-12-18
      • 1970-01-01
      • 2012-05-13
      • 2017-02-11
      相关资源
      最近更新 更多