65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (11投票s)

2007年9月4日

CPOL

7分钟阅读

viewsIcon

79282

downloadIcon

1858

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

Screenshot - CslaGen.gif

引言

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 模式的 ActiveObjects CSLA 扩展。撰写本文时,主要贡献者是 Andrés Villanueva(又名“xal”)。Google 群组地址是 这里。您可以在 这里 获取最新版本,C# 模板的最新版本可以在 这里 找到。

虽然 CSLA 文档非常详尽,但 CslaGen 的贡献者却缺乏时间来编写文档。本项目仅是一个示例,旨在说明一些非常基础的 CslaGen 使用方法。

背景

Rocky Lhotka 不遵循面向数据的对象概念,而是使用面向行为的对象概念。对象由其职责定义。因此,您应该在选择列表和编辑对象本身时使用不同的对象。

数据库

Family 数据库由 MotherDaughter 表组成。后者引用前者,如下面的图 1 所示。

Fig. 1 - Database Family diagram
图 1 - 数据库 Family 图

在 SQL Server 中,创建一个名为 Family 的数据库。项目文件 CslaGen.zip 包含创建数据库表并填充一些数据的查询。

项目结构

我们假设 MotherDaughter 对象都是大对象,包含大量属性。加载这些对象的集合非常耗时,我们将加载一个包含较轻量级 abcInfo 对象的 abcList 集合(仅包含名称和加载所选对象所需的信息)。请注意,abcListabcInfo 是只读对象。正如您在图 2 中看到的,MotherList 是一个 MotherInfo 子对象的根集合,允许我们选择一个 Mother 并加载完整对象。Mother 对象是一个可编辑的根对象。它加载 DaughterList,这是一个 DaughterInfo 孙对象的子集合。在选择了一个 DaughterInfo 孙对象后,我们的应用程序将会加载完整的 Daughter 对象以便进行编辑。

Fig. 2 - Family objects diagram
图 2 - Family 对象图

创建根级别选择对象

职责:列出和选择根对象。

在此步骤中,我们将创建列表对象以列出和选择要编辑的根对象。如果您的应用程序不需要列出根对象,则可以跳过此步骤。加载一个完整的根对象集合(包含其所有属性和子对象)可能是一个耗时的过程。这就是为什么我们更喜欢只使用根对象的部分属性,并忽略子对象。如果您倾向于列出完整的根对象

  • 在步骤 2.2 中,只需右键单击并选择 **全选**。
  • 在步骤 2.3 中,创建一个 **可编辑根集合** 而不是 **只读集合**。
  • 3.1. 在“Schema Objects”窗格中,选择数据库表 Mother
  • 3.2. 在“Columns”窗格中,选择数据库列 IDForenameSurnameLastChanged
  • 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 并将 DataPortalFactoryProcedure 设置为 True(请注意 ProcedureName 字段会自动更改为 GetMotherList),然后单击 **OK**。
  • 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% 开头的名称。

创建根对象“Mother”

职责:编辑 Mother 详细信息。

  • 4.1. 在“Schema Objects”窗格中,选择数据库表 Mother,右键单击并选择 Create Editable Root。将创建一个名为 Mother 的新对象,其中包含此表的所有列。
  • 4.2. 在 **09. System.Object Overrides** 下,通过单击向下箭头更改 ToString Property。选择 ForenameSurname,然后按 **ENTER**。

创建子级别选择对象

职责:列出和选择子对象。

我们假设加载完整的子对象集合可能是一个耗时的过程。因此,我们更喜欢使用 Daughter 的子集集合。在选择要使用的 Daughter 后,我们将加载完整对象。当然,还有其他处理大型子对象的可能策略。在理解了这个示例后,您可以轻松地将其改编为加载完整的子对象集合。

  • 5.1. 在“Schema Objects”窗格中,选择数据库表 Daughter
  • 5.2. 在“Columns”窗格中,选择数据库列 DaughterIDForenameSurnameMotherIDLastChanged
  • 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”下,将 NameParameterNameTypeName 设置为 DaughterList。现在单击 **OK**。

创建根对象“Daughter”

职责:编辑 Daughter 详细信息。

子对象永远不会直接加载;它们的父对象会负责加载。Daughter 的父对象是 Mother,但我们没有加载完整的 Daughter 对象集合,而是假设这可能是一个耗时的过程,并加载了一个 Daughter 子集集合。

  • 6.1. 在“Schema Objects”窗格中,选择数据库表 Mother,右键单击并选择 **Create Editable Root**。将创建一个名为 Mother 的新对象,其中包含此表的所有列。
  • 6.2. 在 **09. System.Object Overrides** 下,通过单击向下箭头更改 ToString Property。选择 ForenameSurname,然后按 **ENTER**。

示例程序

示例程序非常简单。它用母女填充一个树视图(尽管有些母亲没有任何女儿)。出生日期和地点仅在工具提示中显示。没有提供编辑数据的选项。

Fig. 3 - Family program
图 3 - Family 程序
  • 7.1. 下载演示/源文件并解压缩。文件 FamilyGen.xmlCslaGen 项目的生成结果。
  • 7.2. 在 SQL 2000 或 SQL 2005 中,创建一个名为 Family 的数据库,并运行SQL scripts目录中的脚本。如果出现问题,请删除 MotherDaughter 表,并按照正确的顺序重新运行脚本。
  • 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 日
© . All rights reserved.