【问题标题】:Hiding Entity Model classes from Presentation Layer从表示层隐藏实体模型类
【发布时间】:2011-07-13 21:27:16
【问题描述】:

我正在使用 C# Framework 3.5 开发 Web 表单应用程序

我想在我的应用程序中构建类似“Presentation > BLL > DAL > Entity Model”的流程。但问题是,我将如何在表示层中使用实体对象?

建议?

【问题讨论】:

    标签: c# entity-framework architecture


    【解决方案1】:

    你在使用实体框架吗?

    如果是这样,请使用 POCO 生成器而不是默认的 EntityObject。

    虽然 POCO 是从数据库模型生成的,但它们实际上是松散耦合的,因为您可以更改 DAL 的实现,同时保留以前生成的 POCO 作为域模型。

    我建议将 POCO(以及 POCO 生成器创建的相关 T4 模板)移动到由表示层、BLL 和 DAL 引用的不同项目中。

    编辑:

    另一种方法(如果 POCO 生成器在 3.5 中不工作)是手动创建域类并在 DAL 的接口中使用它们。它会增加工作量,但我建议不要将 EntityObjects 暴露在 DAL 之外。

    【讨论】:

    • 感谢@Steve Morgan。是的,使用实体框架我正在考虑同样的问题。但我注意到,POCO 生成的类在 Framework 3.5 中不起作用。看到这个问题stackoverflow.com/questions/6685448/…除了POCO还有什么替代品?
    • 生成的类是否存在可以手动修复的特定问题?您可以修改 T4 模板(正如我出于各种原因所做的那样)以生成最适合您的类。
    • 啊,这是 ObservableCollection 的东西,恕我直言,无论如何都是一种痛苦。正如我所提到的,您可以修改 T4 模板并删除依赖项。
    • 谢谢史蒂夫。剩下一个错误..在这一行
      public ObjectResult<lead> GetLeads()<br/> {<br/> **return base.ExecuteFunction<lead>("GetLeads");**<br/> }<br/>错误是

      类型'Proj.EntityModel.employee'不能用作泛型类型或方法'中的类型参数'TElement' System.Data.Objects.ObjectContext.ExecuteFunction(string, params System.Data.Objects.ObjectParameter[])'。没有从“Proj.EntityModel.employee”到“System.Data.Objects.DataClasses.IEntityWithChangeTracker”的隐式引用转换
    • 需要更多信息。 Employee 现在是 EntityObject,生成的 POCO 还是手工制作的 POCO。发布一个新问题可能是个好主意。
    【解决方案2】:

    我实际上会采取以下方法:

    将模型 (POCO) 例如放在仅由您的 DAL 和 BLL 引用的项目中。这将确保您可以在 DAL 层中使用它们并在 BLL 中将业务逻辑应用于它们。

    对于表示层,我将创建 DTO(数据传输对象),它将仅携带特定场景/实体所需的数据。 DTO 和 POCO 之间的翻译,我将放在 BLL 中。

    我可以想到这种方法的以下优点和缺点:

    1) 优点

    -- 表示层和核心层(BLL、DAL)之间的完全分离。您的 DTO 将独立于数据库 (POCO),这意味着无论您对数据库进行什么更改,您只需要在翻译层中进行更改。

    -- 稳定的 BLL API -- 验证分离——您可以对演示文稿的 DTO 和 BLL 的 POCO 实施验证。

    2) 缺点

    -- 每个 POCO-to-DTO 的翻译规则。这将不可避免地给你的代码增加一些复杂性,但我相信这是一个很好的回报。 -- 性能开销。 DTO 和 POCO 的转换和实例化将为您的应用程序增加一些开销。根据您的要求和机器能力,您可以决定这是否是一个不错的回报。

    我还建议您查看一些允许在不同类型对象之间轻松映射/转换的映射库。在我看来,无论是在简单性还是性能上,最好的是ThisMember

    问候

    【讨论】:

      【解决方案3】:

      我建议您将 edm 放在数据层中。然后有另一个具有所有 poco 实体类的通用项目。您可以使用 Protocol Buffer for .net 将这些实体对象映射到您的 poco 实体。

      在 bll 中,您可以制作适配器类,这应该是表示和 dal 之间的唯一接口。 Bll 应该使用 poco 实体与表示层通信。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        相关资源
        最近更新 更多