如何在 3 层(单层)应用程序中在 BLL 和 UI 之间传递数据?
Posted
技术标签:
【中文标题】如何在 3 层(单层)应用程序中在 BLL 和 UI 之间传递数据?【英文标题】:How to pass data between BLL and UI in 3-layer (single tier) application? 【发布时间】:2010-12-23 06:55:26 【问题描述】:我是一个相当新手的程序员,正在尝试学习 n 层架构(DAL、BLL、UI)的基础知识。我正在编程的应用程序是用 VB.NET (.Net 3.5) 编写的单层 3 层应用程序。图层如下:
DAL
BLL
用户界面
COMMON - 现在包含 DTO。
我无法确定在 BLL 和 UI 之间传递什么。我的直觉告诉我,我应该只将数据传递给 UI,而不是来自 BLL 的完整业务对象。考虑两种情况:
1) 将 BO 直接从 BLL 传递到 UI。这暴露了 BO 方法并允许 UI 直接访问 BO,这似乎很糟糕。
2) 仅将相关数据从 BO 传递到 UI。例如,客户有姓名和地址。这些数据确实是我们想要在 UI 中显示/编辑的内容,因此我们只会将该数据返回到 UI 而不是完整的 BO。然后 UI 会调用 BLL 来更新特定的 BO。
我倾向于使用#2,但我不知道实现它的最佳方式。我现在的编程方式是,如果我只从 BLL 返回数据,所有对我的 BO 的引用都将丢失,GC 将声明它们。基于此,我有一些问题:
1) 我应该在调用 BLL 之间保持业务对象处于活动状态吗?另一种方法是在每次通过 BLL 传递数据时重新创建它们,这似乎是错误的。
2) 在单层架构中保持 BO 存活的最佳方法是什么(如果我们不将引用传递给 UI,如何保存它?)
3) n 层应用程序如何做到这一点?他们是否让 BO 在 BLL 中存活并等待来自 UI 的更新?这是否需要在 BLL 中进行大量“簿记”以确保 BO 在不再需要时被释放?
感谢您的任何见解,如果我问的是愚蠢的问题,请原谅我。我自学了一些我知道的小程序,所以我可能会问一个愚蠢的问题并且不知道。
【问题讨论】:
这个帖子很有帮助:***.com/questions/518329/… 谢谢乍得,我读过那个帖子。似乎每个业务对象都有一个“经理”正在朝着贫血领域模型发展,不是吗? 【参考方案1】:请参阅Pet Shop 作为 3 层架构的示例。我将 BLL 和 DAL 都实现为服务对象,它本身不包含任何状态。由于它们是无状态的,我可以使用singleton 模式并让factory 保留它以方便参考。
以下是您可以使用的一些示例 CRUD 方法:
FooInfo DALFactory.FooService.Retrieve(int id);
FooInfo BLLFactory.FooService.Retrieve(int id);
IList<FooInfo> DALFactory.FooService.RetrieveAll;
IList<FooInfo> BLLFactory.FooService.RetrieveAll;
FooInfo DALFactory.FooService.Create(FooInfo entity);
FooInfo BLLFactory.FooService.Create(FooInfo entity);
FooInfo DALFactory.FooService.Edit(FooInfo entity);
FooInfo BLLFactory.FooService.Edit(FooInfo entity);
void DALFactory.FooService.Delete(FooInfo entity);
void BLLFactory.FooService.Delete(FooInfo entity);
正如您在这两种情况下所看到的,您传递了同一个没有任何逻辑的实体对象(也称为数据传输对象)。这种架构允许您将 UI 层从 BLL 断开到富客户端和 Web 服务组合。
Retrieve
和RetrieveAll
方法的内涵是从数据库中抓取数据并填充到实体对象中。 Create
方法根据给定的实体向数据库添加一个新行。在这个架构中,除了业务逻辑层的BLLFactory.FooService
和实体FooInfo
对象之外,没有“业务对象”。
就这些对象的生命周期而言,无状态的BLLFactory.FooService
被创建一次,只要应用还活着就会被重复使用。 FooInfo
可以为每个对象创建一次,然后持久化到 ASP.NET 会话或其他东西中。
【讨论】:
因此,当您提取数据以显示给用户时,会创建一组 BO,然后将其丢弃。当用户需要更新一些数据时,会在返回 DAL 的途中生成新的 BO,对吗?您正在双向创建新的 BO? 什么是 BO?如果你的意思是 BLLFactory.FooService,它被创建一次并且被多次重用。 抱歉,BO = 业务对象。如果我没看错,您的 FooService 正在从 DTO 创建一个业务对象。假设我们的应用程序只是显示一些数据,允许用户编辑,然后保存它。 FooService 创建的对象是在整个编辑和保存期间保持在范围内,还是在显示数据时创建一次,在保存数据时再次创建? DALFactory.FooService 及其包装器 BLLFactory.FooService 是完全无状态的。所有状态都必须存储在实体 FooInfo 中。我更新了答案。 感谢您的回复。我认为我试图实现的架构与您所展示的不同,但我很欣赏这些例子。我看到很多人使用您在此处使用的相同原则,但我也看到像 Martin Fowler 这样的人似乎想要在业务对象中同时使用数据和逻辑。在您使用的示例中,数据位于 FooInfo 实体中,BLLFactory 和 DALFactory 包含所有逻辑。因此,假设我们希望 FooInfo 能够打印。你的架构是 BLLFactory.FooService.Print(FooInfo) 而我的架构是 FooInfo.Print【参考方案2】:这就是我一直这样做的方式:
UI - ASP.Net 或 Windows 调用 Web 服务 SERVICE - 这是 UI 调用的服务层 COMMON - DTO - 数据传输对象,键在名称中 BLL - 包含业务对象和代码以将 DTO 映射到业务对象,然后仅将 DTO 传递给服务层 DAL - 数据访问
【讨论】:
谢谢伯特,这就是我想要实现的目标。 BLL 在通话之间是否保留 BO?例如,我们拉取数据以在 UI 中显示,从而在 BLL 中创建 BO。这些 BO 是保留用于返回数据,还是在数据被发送回 DAL 进行存储时被丢弃并创建新的? 我们在 Web 服务上工作,以便在每次请求后处理业务对象。以上是关于如何在 3 层(单层)应用程序中在 BLL 和 UI 之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章