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

LightSwitch 在线订购系统

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (65投票s)

2011年3月21日

Ms-PL

12分钟阅读

viewsIcon

238147

downloadIcon

4482

一个端到端 LightSwitch 应用程序的示例

OnlineOrdering/img4E.jpg

引言

在本文中,我们将使用 LightSwitch 创建一个端到端的应用程序。目的是演示 LightSwitch 如何让您创建专业的业务应用程序,而这些应用程序如果由单个开发人员来完成,可能需要数周时间。使用 LightSwitch,您可以在不到一小时的时间内创建这样的应用程序。

背景

这是一个类似于我过去构建的应用程序。我对需求很熟悉,并且确切地知道以其他方式构建它需要多长时间。我估计使用 LightSwitch 可以节省至少 98% 的开发时间。

LightSwitch

使用 LightSwitch 的最大优势在于重构和验证。重构很重要,因为总会有需要添加或删除的字段。通常,这非常耗时。使用 LightSwitch,只需几秒钟即可对数据库进行重大更改,这些更改会自动反映在用户界面中。

验证也非常重要。Lightswitch 提供了诸如 并发检查 之类的功能,手动实现这些功能将非常耗时。

场景

在本例中,我们将被要求为一个 订单跟踪系统 创建一个满足以下要求的应用程序:

  • 产品
    • 允许创建产品
    • 允许产品具有重量
    • 允许产品具有价格
  • 公司
    • 允许创建公司
    • 允许公司登录并查看他们的订单
  • 订单
    • 允许管理员查看所有公司并为任何公司下订单
    • 允许登录的公司只能为自己查看和下订单
  • Business Rules
    • 单个订单重量不能超过 10 磅
    • 单个订单金额不能超过 100 美元
    • 订单状态必须是有效的订单类型之一

创建应用程序

打开 Visual Studio 并选择 文件,然后选择 新建项目

选择 LightSwitch,然后选择您喜欢的编程语言。本教程将使用 C#

解决方案资源管理器 中,打开 属性

选择 Web 作为 应用程序类型,并指示它将在 IIS 中托管。

选择 创建新表

点击表名将其更改为 Customer。根据上图输入表的字段。

(注意:我们还将表称为实体,因为在编写自定义编程时,最好将它们视为实体。)

点击 UserName 字段,然后在 属性 中勾选 包含在唯一索引中。这将防止输入重复的 UserName

LightSwitch 不允许您为 LightSwitch 内部创建的实体创建主键(您可以为主键连接的外部表创建主键)。在通常创建主键的地方,请使用 包含在唯一索引中

右键单击 ApplicationData 节点以添加新的 (实体)。

根据上图添加一个 Product 实体。

根据上图添加一个 Order 实体。

根据上图添加一个 OrderDetail 实体。

创建选择列表

打开 Order 实体并选择 OrderStatus 字段。在 属性 中,选择 选择列表

根据上图输入选项。

这将导致屏幕(稍后创建)自动提供带有这些选项的下拉列表。

连接(关联)实体(表)

创建与您 LightSwitch 项目中的所有实体之间的关联非常重要。在正常应用程序中,这将是创建外键的过程(LightSwitch 在后台也是这样做的)。外键通常是可选的,因为大多数应用程序没有它们也能继续工作。使用 LightSwitch,您确实必须创建关联才能使功能正常运行。

实体很少会不与其他实体有一个或多个关联。

打开 Order 实体并点击 关系 按钮。

根据上图将其与 Customer 实体关联。

根据上图重复此过程,将 OrderDetail 实体与 Order 实体关联。

根据上图重复此过程,将 OrderDetail 实体与 Product 实体关联。

创建计算列

计算列是指显示未实际存储在表中的数据的列。这就是为什么我喜欢称它们为实体而不是表。如果您查看 SQL Server,表中将没有该字段,但当您针对实体编写代码时,该字段就存在了。

拥有计算字段的原因是 LightSwitch 会自动在屏幕上显示数据,而无需您编写更复杂的代码。例如,我们希望显示 Order 的总金额。我们可以将此计算留到稍后创建屏幕时处理,或者现在就创建一个计算字段。

稍后,我们只需告诉 Lightswitch 显示 Order 实体。Order 的总金额将自动显示。

点击 OrderTotal 字段,并在 属性 中勾选 Is Computed

点击 Edit Method

将显示一个方法。

将方法更改为以下内容

partial void OrderTotal_Compute(ref decimal result)
{
    decimal dOrderTotal = 0.0M;

    // Get OrderDetails that have products
    var colOrderDetails = from OrderDetails in this.OrderDetails
                          where OrderDetails.Product != null
                          select OrderDetails;

    foreach (var order in colOrderDetails)
    {
        dOrderTotal = dOrderTotal + (order.Quantity * order.Product.ProductPrice);
    }

    result = dOrderTotal;
}

计算器符号将出现在 OrderTotal 字段旁边,这样您就知道它是一个计算字段。

OrderWeightTotalOrderName 设为计算列,并使用以下代码为其各自的方法

partial void OrderWeightTotal_Compute(ref double result)
{
    double dblWeightTotal = 0;

    // Get OrderDetails that have products
    var colOrderDetails = from OrderDetails in this.OrderDetails
                          where OrderDetails.Product != null
                          select OrderDetails;

    foreach (var order in colOrderDetails)
    {
        dblWeightTotal = dblWeightTotal + 
           (order.Quantity * order.Product.ProductWeight);
    }

    result = dblWeightTotal;
}

partial void OrderName_Compute(ref string result)
{
    if (this.Customer != null)
    {
        result = String.Format("{0} [{1} {2}]", 
          this.Customer.CustomerName, this.OrderStatus, 
          this.OrderDate.ToShortDateString());
    }
}

Order 表将类似于上图。

虽然我们可以创建 LightSwitch 屏幕上的代码来实现很多相同的功能(我们将在后面的步骤中创建屏幕),但实体(表)是这段代码的正确位置,原因有两个:

  • 字段将自动出现在实体出现的任何屏幕或下拉列表中
  • 我们可以对计算值编写代码

验证代码

验证代码的目的是阻止在不满足某些规则时保存或更新实体记录。需要注意的是,验证代码一次只作用于一个实体,但是“规则”可以基于多个实体的数据。

我们可以验证单个字段或整个实体。首先,我们将查看验证单个字段(或属性)。

打开 OrderDetail 实体并点击 Quantity 字段。在 属性 中,点击 Custom Validation

您将看到一个方法,它只是要求您将 PropertyError 添加到 results 集合中。错误的存在将阻止实体被保存,并会显示错误。

将方法更改为以下内容

partial void Quantity_Validate(EntityValidationResultsBuilder results)
{
    if (this.Quantity < 1)
    {
        results.AddPropertyError("Quantity must be greater than zero.");
    }
}

"this." 是正在保存的实体。我们只需检查 Quantity 是否大于 0

现在我们来看实体验证。

打开 OrderDetail 实体并选择 Write Code,然后选择 OrderDetails_Validate

为该方法使用以下代码

partial void OrderDetails_Validate(OrderDetail entity, 
             EntitySetValidationResultsBuilder results)
{
    // Total for order cannot be over $100
    if (entity.Order.OrderTotal > 100)
    {
        results.AddEntityError(String.Format(
           "Total order cannot be over $100.00"));
    }

    // Weight for order cannot be over 10 lbs
    if (entity.Order.OrderWeightTotal > 10)
    {
        results.AddEntityError(String.Format(
          "Total Weight for order cannot be over 10 lbs"));
    }
}

选择 Order 实体上的 Orders_Validate 方法。

将方法更改为以下内容

partial void Orders_Validate(Order entity, 
        EntitySetValidationResultsBuilder results)
{
    // Weight for order cannot be over 10 lbs
    if (
        (entity.OrderStatus != "New") &&
        (entity.OrderStatus != "Processing") &&
        (entity.OrderStatus != "Complete")
        )
    {
        results.AddEntityError(String.Format(
          "The only valid Status is 'New', 'Processing', or 'Complete'"));
    }
}

请注意,LightSwitch 将自动为 OrderStatus 字段创建一个下拉列表,因为它使用的是选择列表;但是,您仍然可以覆盖它并将其更改为文本字段。在这种情况下,您将需要此验证。

预处理查询

预处理查询 允许我们修改用于访问数据的查询。正常查询会被执行,但任何 PreProcess 方法都会为查询添加一个额外的约束。在本例中,我们将使用它来:

  • 允许公司(非管理员)查看并仅为自己下订单。

基本上,我们只会在用户不是管理员时应用 PreProcess 查询。我们将把此查询应用于将在用户登录到应用程序时授予公司访问权限的实体。

  • Customers
  • 订单
  • 订单详情

我们将阻止 Customer/Company 访问公司屏幕(我们将在稍后步骤中创建)。另外请注意,虽然我们不打算允许 Customer 查看主公司屏幕,但我们需要设置安全,以便任何显示客户的下拉列表仅限于显示 Customer 的自己的记录。

这是学习“以 LightSwitch 的方式”思考的例子。尽可能在实体级别实现业务规则和安全性。稍后创建的任何屏幕或下拉列表都将自动遵循您创建的规则。这可以节省大量时间,并使最终应用程序比在列表或下拉列表显示在屏幕上时创建代码要稳定和健壮得多。

打开 Order 实体并选择 Orders_All_PreProcessQuery

将方法更改为以下内容

partial void Orders_All_PreprocessQuery(ref IQueryable<Order> query)
{
    // This will run if the user is not an Administrator
    bool IsAdmin = this.Application.User.HasPermission(
                        Permissions.SecurityAdministration);
    if (!IsAdmin)
    {
        // This will restrict this query to Orders that belong to the current Customer
        query = query.Where(x => x.Customer.UserName == this.Application.User.Name);
    }
}

OrderDetail 实体执行相同的步骤(OrderDetails_All_PreprocessQuery)。

partial void OrderDetails_All_PreprocessQuery(ref IQueryable<OrderDetail> query)
{
    // This will run if the user is not an Administrator
    bool IsAdmin = this.Application.User.HasPermission(
                          Permissions.SecurityAdministration);
    if (!IsAdmin)
    {
        // This will restrict this query to Orders that belong to the current Customer
        query = query.Where(x => x.Order.Customer.UserName == this.Application.User.Name);
    }
}

Customer 实体执行相同的步骤(Customers_All_PreprocessQuery)。

partial void Customers_All_PreprocessQuery(ref IQueryable<Customer> query)
{
    // This will run if the user is not an Administrator
    bool IsAdmin = this.Application.User.HasPermission(
                          Permissions.SecurityAdministration);
    if (!IsAdmin)
    {
        // This will restrict this query to the current Customer
        query = query.Where(x => x.UserName == this.Application.User.Name);
    }
}

创建屏幕

创建屏幕非常容易。在本例中,我们将只使用默认屏幕,但它们是高度可定制的,您也可以使用自己的 Silverlight 自定义控件。有关更多信息,请参阅我的网站上的教程:http://LightSwitch.ADefWebserver.com

打开一个实体并选择 Screen 按钮。

选择 Editable Grid Screen 模板,并为 Screen Data 选择 Customers

屏幕设计器将出现,并且屏幕将显示在Screens文件夹中。这是您通常会自定义屏幕的地方。在本教程中,我们不会自定义屏幕,但我们会添加一小段代码来阻止非管理员访问屏幕。

选择 Write Code,然后选择 EditableCustomerGrid_CanRun

将方法更改为以下内容

partial void EditableCustomersGrid_CanRun(ref bool result)
{
    // User must be an Administrator
    result = this.User.HasPermission(Permissions.SecurityAdministration);
}

Product 实体执行相同的步骤来创建屏幕。

另外,请对该屏幕的 EditableProductsGrid_CanRun 方法使用以下代码:

partial void EditableProductsGrid_CanRun(ref bool result)
{
    // User must be an Administrator
    result = this.User.HasPermission(Permissions.SecurityAdministration);
}

对于 Orders 实体,选择 List and Details Screen 模板,为 Screen Data 选择 Orders,为 Additional Data to Include 选择 Order DetailsOrder OrderDetails

我的代码在哪里?

您可能会对将代码放在各种地方感到有些紧张。您可能想知道如何轻松找到在 LightSwitch 项目中创建的自定义代码。这不是问题。

解决方案资源管理器 中,选择 File View

选择 Show All Files

您将轻松地在UserCode文件夹中找到所有自定义代码。

运行应用程序

至此,我们已经完成了应用程序的创建。如果您是专业开发人员,并且感到一阵寒意,您并不孤单。请放心,仍然需要专业开发人员来创建 LightSwitch 程序,例如 此处链接 中所述的程序。

在运行应用程序之前,让我们看看我们将成为的用户。进入 Properties...

选择 Access Control,并确保为 SecurityAdministration 勾选了 Granted for Debug。当我们以 Debug 模式运行项目时,我们将成为一个名为 TestUser 的用户。当您勾选该框时,该用户将成为管理员。

稍后,我们可以取消勾选此框,我们将能够看到普通 Customer 在运行应用程序时会看到什么。但是,该 Customer 必须在用户表中拥有一个名为“TestUser”的帐户,因为在 Debug 模式下运行 LightSwitch 应用程序时,您始终是该用户。

F5 来构建并运行应用程序。

您将自动登录为 TestUser。当我们部署应用程序时,将首先显示登录屏幕。

我们输入两个 Customers。我们确保其中一个用户是“TestUser”。

请务必点击 Save 按钮来保存您的数据。

输入一些 Products...

当我们转到 Order List Detail 屏幕时,我们可以点击绿色的大加号按钮打开 Add New Order 弹出窗口。

(是的,您可以控制所有这些屏幕和弹出窗口的设计和布局(包括阻止弹出窗口),但请注意,我们付出了很少的努力就创建了多少内容。)

我们可以向 Order 添加 Order Details

如果我们停止程序并取消勾选 Granted for Debug 复选框,然后再次按 F5 键……

我们看到唯一可以访问的屏幕是 Orders List Detail 屏幕,并且我们只能看到和下“TestUser”的订单。

部署应用程序

在 SQL Server 中创建一个数据库。确保您有一个具有数据库所有权的帐户。

Visual Studio 中,选择 Build,然后选择 Configuration Manager

更改为 Release 模式(如果您不这样做,您将在部署的应用程序中看到“屏幕设计”框)。

Visual Studio 中,选择 Build,然后选择 Publish OnlineOrdering

选择 Web

选择 IIS

输入您要部署网站的地址(此服务器必须安装 LightSwitch Deployment Prerequisites;向导上一页有链接)。

输入您之前创建的 SQL Server 帐户。

在此屏幕上,您需要为应用程序创建一个用户。首次运行应用程序时,这将是唯一用户。您需要登录此用户,以便为所有其他用户创建帐户。

您可以直接点击 Specify a Certificate 页上的 Next

点击 Publish

在您的 Web 浏览器中导航到该网站。使用您在向导中创建的帐户登录。

由于此用户是管理员,因此他/她可以在 Menu 中看到 Administration。点击 Users

您将能够创建其他用户。

当您在 Customers 屏幕中进行录入时,请确保 User Name 与在 Users 屏幕上创建的 User Name 匹配。

如果您关闭 Web 浏览器并以您创建的用户身份登录,您会发现该用户只能下订单和查看自己的订单。

所有业务验证也将起作用。

你无法把精灵放回瓶子里

如果您是专业开发人员,您必须接受这个事实,事情已经永久改变了。花费六位数预算雇佣半打开发人员在几周内完成一个普通的 LOB 应用程序的日子可能已经结束了。虽然某些项目仍然需要昂贵的定制 HTML 前端,但大多数应用程序都是“后台管理”,而这些可以在 LightSwitch 中由一名开发人员在几天内完成。

好消息是,LightSwitch 将主要用于替换目前手动在 Excel 中完成的项目。表单数据应用程序的市场刚刚变得更大。但是,任何可以用 LightSwitch 完成的项目都可以节省 75% 以上的时间和成本。唯一的竞争方式是尽可能在适当的地方使用 LightSwitch。

我的网站上有更多 LightSwitch 教程:http://LightSwitchHelpWebsite.com

© . All rights reserved.