Arkitech 平台框架





1.00/5 (1投票)
本文的主要目的是为有兴趣使用 .NET Framework 构建以数据为中心的应用程序的 VB.NET 开发人员提供高质量的示例源代码。
引言
Arkitech 平台框架 (APF) 是一个对象关系映射器,它使 .NET 开发人员能够使用领域特定对象处理关系数据。它消除了开发人员通常需要编写的大部分数据访问代码。APF 是一个软件开发框架,可帮助您在构建 Windows Forms (WinForms) Microsoft SQL Server (MSSQL) 数据导向应用程序时构建可维护的业务逻辑层。在 .NET 软件开发环境中存在多个数据访问框架。这是一个创建动态数据库更改业务逻辑层 (BLL) 的尝试。这个框架与其他框架的不同之处在于它是一个动态灵活的 UI。
业务逻辑随时都在变化。这些变化会触发底层数据库的自动变化。此平台使您能够创建面向对象的业务层,该层抽象并封装所有业务逻辑和数据。该框架确保即使您的业务对象发生变化,它们仍能无缝运行。BLL 类中发生的任何更新都会相应地触发底层数据库的更新。
利用该平台的主要好处是它有助于您的应用程序实际自我构建。
- 无需代码数据访问层 - 一个数据访问层 (DAL) 构建器,无需您编写任何代码,它在编译时自行构建,具有完整的对象层和强类型集合。
- 完整工具集 - 一个完整的实用工具集,包括类似于 Rails 的脚手架、迁移(DB 版本控制)和代码生成器。
- 动态查询工具 - 一个动态查询工具,让您无需了解 SQL 即可使用 SQL Server 和企业库。
- OR 映射器 - 一个 OR 映射器,它扩展到视图和存储过程,因此您不会被锁定在 OR/M 领域。
背景
Arkitech 平台是一个 VB.NET 项目,它与 Subsonic 非常松散地相关。Subsonic 是一个流行的实用工具集,可显着加快数据库驱动的 Web 应用程序的开发时间。SubSonic 是一个由 Rob Conery 和核心开发团队开发的 .NET 开源项目。还使用了一些基于 Rockford Lhotka 的 CSLA.NET 项目的通用思想。除此之外,可能还有一些来自互联网上发现的代码片段。
比较
那么这与 Entity Framework (EF) 有什么区别呢?EF 是一个“代码优先”框架。在这种情况下,您不必费心数据库图,只需编写表示您要存储的对象的 POCO 类。然后,您可以在一个名为 DbContext 的特殊类中引用这些类,以让 EF 将它们持久化到数据库中。Microsoft 为 EF 添加了一个仅在代码优先中可用的关键功能,即迁移。迁移允许您更改数据类,然后更新数据库而不会丢失数据。
APF 方法
使用 APF 方法,您也受益于“代码优先”。如果您以后重构代码,您的更改将“即时”迁移到数据存储。但是,EF 对我来说最大的缺点在于 DbContext 类。EF 中的 DbContext 类表示一个组合存储库,它可以用于从数据库查询并分组将作为单元写回存储的更改。换句话说,在 DbContext 类中,您的所有数据操作都在一个类文件中完成。
DbContext 类也可能是一个难以调试的黑盒;您必须跟踪它生成的 SQL 并弄清楚为什么出现问题。对于我们这些经常需要回去更改一个特定小项的人来说,这可能相当令人恼火。我更喜欢业务类及其底层数据操作的分离。在 APF 中,数据操作由特定的“管理器”类(即 TaskManager、PeopleManager、UserManager 等)完成。
此外,APF 遵循 MVC 如此流行的趋势。业务关注点的分离意味着视图类分配可以非常特定于类。无需将整个 DbContext 及其所有机制分配给每个视图。不拆分代码组件很可能会在关注点之间引入不必要的耦合。
假设
这个框架通常针对自由职业的 ISV。这里的一个关键假设是数据库是一个新的和/或现有的数据库,您拥有修改的管理权限。另一个假设是您在创建数据库表时使用某种类型的 数据库规范化。此处提供的数据类尽可能接近 第四范式 (4NF)。
代码架构
-
映射 - APF 使用自定义的基于属性的强类型代码映射。这使得实体和数据库详细信息可以保存在同一个地方。强类型的基于代码的映射允许动态创建数据库模型并对其进行强类型化,因此,例如,如果属性名称发生更改,映射将不会受到影响。
-
关联 - APF 支持一对一、一对多和多对多。
- 查询 - APF 公开了多个查询 API:LINQ 可能是当今最常用的,无需介绍;平台 API 是查询对象模式的实现,您通过使用强类型 LINQ 表达式而不是字符串的类模型来创建您希望执行的查询的半抽象概念表示;这比使用 Criteria 字符串更易于重构。
平台内部
FrameWorkConnection
APF 依赖于三个主要类来实现后端数据库和前端 UI 之间的通信。对于前端 UI,您将从单例 FrameworkConnection 类继承。继承的类(例如“Database”)在某些方面类似于 DbContext 类,因为它是一个数据库存储库。每个管理器类都引用此存储库进行 CRUD 操作。
Command 类
Command 类是 APF 与数据库交互的方式。在此示例中,InsertCommand 类包含一个 TableMapping 类,该类有助于使用元数据分解代码对象,以检索要插入到 SQL Server 后端的原始数据。
Using the Code
开发人员只需调用 Manager 类中包含的方法即可执行任何 CRUD 操作。
Public Overrides Sub Create()
Dim preCount As Integer = Count()
Dim ParentID As Integer = 0
Dim UserID As Integer = 1
Dim StateID As Integer = 1
Dim PriorityID As Integer = 1
Dim CategoryID As Integer = 1
Dim ProjectID As Integer = CreateProject.ProjectID
Dim biz As Task = TaskManager.Default
With biz
.CategoryID = CategoryID
.PriorityID = PriorityID
.ProjectID = ProjectID
.ParentID = ParentID
.StateID = StateID
End With
TaskManager.Insert(biz)
TestObject = biz
CreateChildTask()
TestObject = biz
TestAssert.Equals(Count, preCount + 1)
End Sub
有趣的小贴士
在 AP 框架的设计阶段,我发现有必要创建一组基于 SQL Server 的巧妙扩展,这些扩展包含在示例中。
历史
这个项目建立在我几年前在 CodeProject 上开始的第一个项目 TeamVision 的基础上。有关如何将框架实现到应用程序中的入门知识,请在此处查看:TeamVision - 一个简单的项目任务管理应用程序。一种 .NET 托管方法,可帮助您掌握项目。
参考文献
- SubSonic 项目 -http://www.subsonicproject.com/
- CSLA.NET - http://www.lhotka.net/cslanet/
- NHibernate - http://nhibernate.info/