如何使用 CslaGen 生成 CSLA 数据访问层代码






3.67/5 (11投票s)
本文介绍了如何使用 CslaGen 快速为母女关系(分层数据)创建 CSLA DAL 文件。

引言
CSLA 是一个免费的三层框架,适用于 .NET Framework 2.0 和 3.0。Apress 出版的由 Rockford Lhotka 撰写的《Expert C# 2005 Business Objects, Second Edition》一书详细介绍了 CSLA for C#,另有 VB 2005 版本。这不是一个封闭的项目,而是一个活跃且不断发展的项目。它得到了一个充满活力且乐于助人的社区的支持,您可以在 这里找到该社区。您可以 这里 获取 CSLA C# 和 VB 源代码文件(我使用的是 2.1.4 版本)。
CslaGen
是一个代码生成器,负责生成 CSLA 框架所需的数据访问层文件。它包含生成 SQL Server 存储过程以及 C# 或 VB 的模板。它还支持实现 Observer 模式的 ActiveObject
s CSLA 扩展。撰写本文时,主要贡献者是 Andrés Villanueva(又名“xal”)。Google 群组地址是 这里。您可以在 这里 获取最新版本,C# 模板的最新版本可以在 这里 找到。
虽然 CSLA 文档非常详尽,但 CslaGen
的贡献者却缺乏时间来编写文档。本项目仅是一个示例,旨在说明一些非常基础的 CslaGen
使用方法。
背景
Rocky Lhotka 不遵循面向数据的对象概念,而是使用面向行为的对象概念。对象由其职责定义。因此,您应该在选择列表和编辑对象本身时使用不同的对象。
数据库
Family
数据库由 Mother
和 Daughter
表组成。后者引用前者,如下面的图 1 所示。

在 SQL Server 中,创建一个名为 Family
的数据库。项目文件 CslaGen.zip 包含创建数据库表并填充一些数据的查询。
项目结构
我们假设 Mother
和 Daughter
对象都是大对象,包含大量属性。加载这些对象的集合非常耗时,我们将加载一个包含较轻量级 abcInfo
对象的 abcList
集合(仅包含名称和加载所选对象所需的信息)。请注意,abcList
和 abcInfo
是只读对象。正如您在图 2 中看到的,MotherList
是一个 MotherInfo
子对象的根集合,允许我们选择一个 Mother
并加载完整对象。Mother
对象是一个可编辑的根对象。它加载 DaughterList
,这是一个 DaughterInfo
孙对象的子集合。在选择了一个 DaughterInfo
孙对象后,我们的应用程序将会加载完整的 Daughter
对象以便进行编辑。

创建根级别选择对象
职责:列出和选择根对象。
在此步骤中,我们将创建列表对象以列出和选择要编辑的根对象。如果您的应用程序不需要列出根对象,则可以跳过此步骤。加载一个完整的根对象集合(包含其所有属性和子对象)可能是一个耗时的过程。这就是为什么我们更喜欢只使用根对象的部分属性,并忽略子对象。如果您倾向于列出完整的根对象
- 在步骤 2.2 中,只需右键单击并选择 **全选**。
- 在步骤 2.3 中,创建一个 **可编辑根集合** 而不是 **只读集合**。
- 3.1. 在“Schema Objects”窗格中,选择数据库表
Mother
。 - 3.2. 在“Columns”窗格中,选择数据库列
ID
、Forename
、Surname
和LastChanged
。 - 3.3. 右键单击并选择 **创建 -> 只读集合**。请注意,您无法在只读集合中添加或删除项目。
- 3.4. 在“New Object Defaults”窗口中,设置
CollectionName = "MotherList"
和ItemName = "MotherInfo"
。 - 3.5. 在
MotherList
上,创建一个标准来获取集合中的所有项目。- 3.5.1. 在“Csla Objects”窗格中,选择
MotherList
对象。 - 3.5.2. 在“Csla Object Info”窗格中,在 **03. Criteria** 下,通过单击省略号编辑
Criteria Objects
集合。 - 3.5.3. 在“Criteria Collection Editor”窗口中,添加一个名为
AllCollection
的成员(或您喜欢的任何其他名称)。 - 3.5.4. 在“Misc”下,展开
GetOptions
并将DataPortal
、Factory
和Procedure
设置为True
(请注意ProcedureName
字段会自动更改为GetMotherList
),然后单击 **OK**。
- 3.5.1. 在“Csla Objects”窗格中,选择
- 3.6. 现在创建另一个标准,以按名字和/或姓氏获取
Mother
列表。- 3.6.1. 重复步骤 3.5.1 到 3.5.4。但改用成员名称
Name
。 - 3.6.2. 将
ProcedureName
字段更改为GetMotherListByName
。 - 3.6.3. 现在不要单击 **OK**,而是通过单击省略号编辑“Properties”下的
Properties
集合。 - 3.6.4. 添加一个成员。将“CriteriaProperty Collection Editor”窗口拖到屏幕的上部,然后单击
DbBindColumn
字段。 - 3.6.5. 在“Schema Objects”窗口中,选择
Mother
表的Forename
列。现在单击成员面板,成员名称将自动更改。 - 3.6.6. 对
Surname
列重复上述操作。CslaGen
生成的存储过程将组合两个名称。例如,如果您指定Mar
作为名字,而名字为空字符串。您将检索到 Mary Poppins、Mariah Carey 和其他以Mar%
开头的名称。
- 3.6.1. 重复步骤 3.5.1 到 3.5.4。但改用成员名称
创建根对象“Mother”
职责:编辑 Mother
详细信息。
- 4.1. 在“Schema Objects”窗格中,选择数据库表
Mother
,右键单击并选择Create Editable Root
。将创建一个名为Mother
的新对象,其中包含此表的所有列。 - 4.2. 在 **09. System.Object Overrides** 下,通过单击向下箭头更改
ToString Property
。选择Forename
和Surname
,然后按 **ENTER**。
创建子级别选择对象
职责:列出和选择子对象。
我们假设加载完整的子对象集合可能是一个耗时的过程。因此,我们更喜欢使用 Daughter
的子集集合。在选择要使用的 Daughter
后,我们将加载完整对象。当然,还有其他处理大型子对象的可能策略。在理解了这个示例后,您可以轻松地将其改编为加载完整的子对象集合。
- 5.1. 在“Schema Objects”窗格中,选择数据库表
Daughter
。 - 5.2. 在“Columns”窗格中,选择数据库列
DaughterID
、Forename
、Surname
、MotherID
和LastChanged
。 - 5.3. 右键单击并选择 **创建 -> 只读集合**。请注意,您无法在只读集合中添加或删除项目。
- 5.4. 在“New Object Defaults”窗口中,设置
CollectionName
= "DaughterList"
和ItemName
= "DaughterInfo"
。 - 5.5. 在
DaughterList
的“Csla Object Info”窗格中,在 **04. Child Object Options** 下,通过单击向下箭头更改Parent Type
。选择Mother
对象,然后按 **ENTER**。 - 5.6. 现在我们必须将
Mother
对象链接到这个只读集合,以便它知道需要加载该集合。- 5.6.1. 在
Mother
的“Csla Object Info”窗格中,在 **02. Business Properties** 下,通过单击省略号编辑Child Collection Properties
集合。 - 5.6.2. 在“ChildProperty Collection Editor”窗口中,添加一个成员。在“Definition”下,将
Name
、ParameterName
和TypeName
设置为DaughterList
。现在单击 **OK**。
- 5.6.1. 在
创建根对象“Daughter”
职责:编辑 Daughter
详细信息。
子对象永远不会直接加载;它们的父对象会负责加载。Daughter
的父对象是 Mother
,但我们没有加载完整的 Daughter
对象集合,而是假设这可能是一个耗时的过程,并加载了一个 Daughter
子集集合。
- 6.1. 在“Schema Objects”窗格中,选择数据库表
Mother
,右键单击并选择 **Create Editable Root**。将创建一个名为Mother
的新对象,其中包含此表的所有列。 - 6.2. 在 **09. System.Object Overrides** 下,通过单击向下箭头更改
ToString Property
。选择Forename
和Surname
,然后按 **ENTER**。
示例程序
示例程序非常简单。它用母女填充一个树视图(尽管有些母亲没有任何女儿)。出生日期和地点仅在工具提示中显示。没有提供编辑数据的选项。

- 7.1. 下载演示/源文件并解压缩。文件 FamilyGen.xml 是
CslaGen
项目的生成结果。 - 7.2. 在 SQL 2000 或 SQL 2005 中,创建一个名为
Family
的数据库,并运行SQL scripts目录中的脚本。如果出现问题,请删除Mother
和Daughter
表,并按照正确的顺序重新运行脚本。 - 7.3. 在 VS 2005 中,打开CS source目录下的
Family
解决方案。首先,您必须- 更正 CSLA 引用。
- 编辑 App.config 并更正连接字符串。
现在您可以编译并运行该解决方案。
附录:加载 Family TreeView 的 C# 代码
private void formFamily_Load(object sender, EventArgs e)
{
// Load the collection of all light MotherInfo objects
MotherList motherList = MotherList.GetMotherList();
foreach (MotherInfo motherInfo in motherList)
{
// Create the root node
TreeNode node =
treeViewRelations.Nodes.Add(motherInfo.Forename.Trim() +
" " + motherInfo.Surname.Trim());
// Get the complete Mother object
// (along with the DaugtherInfo collection)
Mother mother = Mother.GetMother
(motherInfo.ID, motherInfo.LastChanged);
// Display mother birth date and place on the tooltip
node.ToolTipText = mother.BirthDate + " " + mother.BirthPlace;
foreach (DaughterInfo daughterInfo in mother.DaughterList)
{
// Create a daughter node
TreeNode subNode =
node.Nodes.Add(daughterInfo.Forename.Trim() +
" " + daughterInfo.Surname.Trim());
// Get the complete Daughter object
// NB - From CSLA point of view, the Daughter object
// is a root object (as it loads itself)
Daughter daughter = Daughter.GetDaughter
(daughterInfo.DaughterID, daughterInfo.LastChanged);
// display daughter birth date and place on the tooltip
subNode.ToolTipText = daughter.BirthDate +
" " + daughter.BirthPlace;
}
}
}
历史
- 首次发布:2007 年 8 月 8 日
- 最后修订:2010 年 3 月 18 日