3层设计一直是我数据库驱动应用程序多年来的标准设计理念,它从未让我失望过。对于那些练习它的人,请描述你的图层。
我发现许多人混淆了业务层和数据访问层,使其更像是2.5层设计。
我更喜欢使用存储过程将数据层几乎完全移动到数据库中,并且在代码中只有一个非常轻量级的数据层,它将sproc调用包装到业务对象中。
你如何接近它?
编辑:如果您要做的就是定义3层是什么,请不要浪费时间回复。我正在寻找特定的人如何实现它,你使用存储过程或ORM,你是如何处理DAL和BLL之间的循环依赖?除了说
之外,这个话题还有很多深度答案 0 :(得分:2)
我一直在做一些主要的网络应用程序,并且一直关注3层:
UI:纯ASPX页面。实际上很难将你的业务层从这里推下来,因为快速计算或者其他东西在这里看起来很容易。但是,我已经足够自律,以确保页面后面的代码除了显示/隐藏面板,更新用户输入等之外什么都不做。
DAL:所有数据访问层的东西。我非常喜欢使用可用的XSD / DataTable / TableAdapter类。我还使用基于存储过程的CRUD方法,因此很容易将适配器连接到存储过程。
BLL:在我的大多数应用中,业务层往往是三层中最轻的一层,因为它们主要是CRUD类型的应用程序,内置了一些报告。
答案 1 :(得分:1)
3层:
答案 2 :(得分:1)
我练习3层设计的方式与我使用存储过程处理大部分(如果不是全部)与数据库的通信相同。我接近我的类的设计,以便每个类都有一个特定的目的,以降低复杂性,并在变更时提供更大的灵活性。
我在3层设计中遇到的最大问题之一是放置输入验证的位置。通常,我发现自己在UI和业务层中都重复验证,以便通过快速验证检查使用户受益,并确保进出数据层的数据有效。你如何处理验证?
答案 3 :(得分:1)
更多的旁注:永远不要忘记n层分层是逻辑分层,而不是进程的物理分离。即,不应该使业务逻辑在与表示代码不同的进程(或在不同的框中)上运行。重要的是保持代码清洁。
物理上分离表示代码和业务逻辑已经被宣传了一段时间,例如,通过使用webservices连接到后端。有些情况下这是一个好主意,但它没有任何必要,但会使您的架构,部署,设计和性价比大大增加。
答案 4 :(得分:0)
我认为分层效果非常好。 Take a look at the tiers in the OSI model.我使用了你所描述的三个层次,这种方法确实有帮助。模型视图控制器的抽象通常在大型桌面应用程序中很有用。您可以将事物分成更小,更小,更易于管理的部分。有一个收益递减点。并且,有时我们想要删除抽象层并且可能直接与硬件对话 - 这取决于应用程序的目标。
答案 5 :(得分:0)
我发现2.5层设计最适合我创建的新Web应用程序。 我通常从2个类库和1个Web应用程序开始。
Company.Data
(班级图书馆)Company.Web
(类库)(包含PageBase
,自定义控件,辅助函数等)Company.Web.WebApplication
(网络应用程序)对于我创建的应用程序,我只使用存储过程来访问数据。 实际上,我已经创建了CodeSmith模板来生成所有存储过程,数据和业务类。
Company.Data
此程序集主要由实体数据类和集合组成。
例如,我的Web应用程序中通常有一个名为Settings
的表。
将生成一个名为Setting
和SettingCollection
的课程。
因此,如果我需要加载特定设置,我可以这样做..
Dim setting As New Setting(1) 'pass in the id of the specific setting
setting.Value = "False" 'change the value
setting.Save() ' Call the save method to persist changes back to the database
或创建新设置,我只是不在构造函数中传递值
Dim setting as New Setting()
setting.Name = "SmtpServer"
setting.Value = "localhost"
setting.Save()
Company.Data
程序集中的我的命名空间通常如下所示。
Company.Data.Entites
Company.Data.Collections
Company.Data.BusinessObjects
(此命名空间用于创建访问数据的自定义方法)
我还基于主键,外键和唯一索引生成自定义方法。
例如,设置表中的name列具有唯一索引。
将自动生成一个名为GetSettingByName
的共享方法,这将返回一个设置对象。
此方法将位于Company.Data.BusinessObjects
命名空间
对于实体和业务对象类,将生成两个文件。每次生成的1和可编辑且仅生成的1 第一次。我使用部分类来允许我添加自定义代码而不会被覆盖。
对我来说,这种方法很有效。 Codesmith生成节省了无数个小时的编码。我可以在表中添加5个新列,然后重新生成 所有新代码都在几秒钟内完成。存储过程将被删除并重新创建。
2.5层设计运行良好,因为我的应用程序只使用一个数据库而且是Sql Server。将来不需要使用access,oracle,mysql。
答案 6 :(得分:-1)
我们使用大约6层设计。
浏览器端Javascript和什么不是。这是纯粹的视觉糖,几乎没有商业价值或加工。这里的任何输入验证都是冗余检查 - 它们可以被绕过,所以我们不相信它们。
服务器端HTML演示文稿。这部分是由业务规则驱动的。但是我们使用的模板语言没有处理。
服务器端视图功能,业务逻辑,“控制”。这是导航,验证和“更高级别”面向应用程序的处理的地方。这发生了状态变化 - 事物被计算,更新,删除等。这就是处理。这是强制执行身份验证和授权的地方。
模型定义(使用ORM层)。这是对象模型。它映射到关系模型。它包括作为对象方法的所有模型级处理。这是完成一些计算,过滤,计数,排序的地方。这是我们对数据的有用观点。
访问层(某种数据库连接)。取决于数据库产品。它由ORM层管理,因此我们不进行任何编码,只需配置。
DB中的持久存储(没有存储过程,没有触发器)。
答案 7 :(得分:-2)
DI为我取代了等级。是的,您仍然可以按层对逻辑进行排序,但逻辑层和数据库层之间的差异已经被其他设计问题所模糊,恕我直言。如果你不确定我的意思,请查看“贫血模型”战争。
答案 8 :(得分:-4)
我们曾经使用以下方法接近它: - UI层(所有UI都在) - 业务层(所有业务逻辑都在其中) - 数据层(所有数据库访问都在其中)