【发布时间】:2011-07-13 21:27:16
【问题描述】:
我正在使用 C# Framework 3.5 开发 Web 表单应用程序
我想在我的应用程序中构建类似“Presentation > BLL > DAL > Entity Model”的流程。但问题是,我将如何在表示层中使用实体对象?
建议?
【问题讨论】:
标签: c# entity-framework architecture
我正在使用 C# Framework 3.5 开发 Web 表单应用程序
我想在我的应用程序中构建类似“Presentation > BLL > DAL > Entity Model”的流程。但问题是,我将如何在表示层中使用实体对象?
建议?
【问题讨论】:
标签: c# entity-framework architecture
你在使用实体框架吗?
如果是这样,请使用 POCO 生成器而不是默认的 EntityObject。
虽然 POCO 是从数据库模型生成的,但它们实际上是松散耦合的,因为您可以更改 DAL 的实现,同时保留以前生成的 POCO 作为域模型。
我建议将 POCO(以及 POCO 生成器创建的相关 T4 模板)移动到由表示层、BLL 和 DAL 引用的不同项目中。
编辑:
另一种方法(如果 POCO 生成器在 3.5 中不工作)是手动创建域类并在 DAL 的接口中使用它们。它会增加工作量,但我建议不要将 EntityObjects 暴露在 DAL 之外。
【讨论】:
public ObjectResult<lead> GetLeads()<br/> {<br/> **return base.ExecuteFunction<lead>("GetLeads");**<br/> }<br/>错误是我实际上会采取以下方法:
将模型 (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。
问候
【讨论】:
我建议您将 edm 放在数据层中。然后有另一个具有所有 poco 实体类的通用项目。您可以使用 Protocol Buffer for .net 将这些实体对象映射到您的 poco 实体。
在 bll 中,您可以制作适配器类,这应该是表示和 dal 之间的唯一接口。 Bll 应该使用 poco 实体与表示层通信。
【讨论】: