LightSwitch在线订购系统

分享于 

19分钟阅读

Web开发

  繁體

onlineordering/img4e。jpg

介绍

在本文中,我们将以 为代价创建一个end-to-end应用程序。 它的目的是演示LightSwitch如何让你创建专业的业务应用程序,这些应用程序将花费一个开发人员星期来创建。 使用 LightSwitch,你可以在一个小时内创建这样的应用程序。

背景

这是一个应用程序,就像我在过去构建的应用程序一样。 我熟悉需求,我知道它需要多长时间才能构建这种需求。 我估计使用LightSwitch至少可以节省开发时间中的98%。

LightSwitch

使用LightSwitch的最大优势在于重构和验证。 重构很重要,因为总是有添加和删除字段的更改。 通常这是非常耗时的。 对于自动反映在UI中的数据库,需要花几秒钟的时间来更改数据库。

验证也非常重要。 Lightswitch有类似于并发检查的东西,这是非常耗费时间来手工实现的。

场景

在本示例中,我们将负责生成满足以下要求的应用程序,该应用程序的订单跟踪系统为:

  • 产品
    • 允许创建产品
    • 允许产品有重量
    • 允许产品具有价格
  • 单位
    • 允许创建公司
    • 允许公司登录并查看他们的订单
  • 订单
    • 允许管理员查看所有公司并为任何公司订购订单
    • 允许登录的公司只为自己查看和放置订单
  • 业务规则
    • 没有一个订单可以超过 10磅
    • 不能超过 $100个订单
    • 订单状态必须是有效的订单类型之一

创建应用程序

打开 Visual Studio 并选择 File,然后项目

选择 ,然后选择你所选择的编程语言。 本教程将使用的。

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

选择以为代价的应用程序类型,并表示它将托管在

选择创建新表

单击 table NAME 以将它的更改为客户。 根据上面的图像输入 table的字段。

( 注意:我们也将表称为实体,因为当你编写自定义编程时,最好将它们看作实体。)

点击用户字段,在属性中,检查包含在惟一索引。 这将防止输入重复的位用户名

LightSwitch不允许你为创建 inside LightSwitch ( 你可以为连接的外部表设置主键)的实体创建主键。 在通常创建主键的位置,请使用唯一索引中的

右键单击收费的ApplicationData节点,添加一个新的

根据上面的图片添加一个的产品实体。

添加符合上图像的Order

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

创建选择列表

打开订单,并选择 OrderStatus field域。 在属性中,选择 Choice。

根据上面的图像输入选项。

这将导致屏幕( 稍后创建) 自动提供以下选项。

将( 关联) 连接到实体( 表格)

你必须与LightSwitch项目中的所有实体建立关联,这一点很重要。 在普通应用程序中,这将是创建外部键( 这就是LightSwitch在背景中所做的)的过程。 外键通常是可选的,因为大多数应用程序将在没有它们的情况下继续工作。 使用 LightSwitch,你必须为事情创建关联才能正常工作。

一个实体没有一个或者多个与其他实体的关联是非常少见的。

打开 Order Entity,并单击 Relationship Relationship。

根据上面的图片将它的与的客户实体关联。

重复该过程,根据上面的图像将 OrderDetail OrderDetail Entity实体与收费的订单实体关联。

重复这里过程,根据上面的图片将 OrderDetail OrderDetail Entity实体与 Product实体相关联。

创建计算列

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

你有一个计算字段的原因是,iframe将自动在屏幕上显示数据,而不需要编写更复杂的代码。 例如我们希望显示一个收费的。 我们可以离开这个计算,直到我们创建屏幕,或者我们现在就可以做一个计算字段。

稍后,我们只是告诉Lightswitch显示的订单实体。 将自动显示订单的总计。

单击 OrderTotal字段,并按属性计算 is Properties。

单击编辑方法

将显示一个方法。

将该方法更改为:

partialvoid OrderTotal_Compute(refdecimal result)
{
 decimal dOrderTotal = 0.0M;
 // Get OrderDetails that have productsvar colOrderDetails = from OrderDetails inthis.OrderDetails
 where OrderDetails.Product!= nullselect OrderDetails;
 foreach (var order in colOrderDetails)
 {
 dOrderTotal = dOrderTotal + (order.Quantity * order.Product.ProductPrice);
 }
 result = dOrderTotal;
}

计算器符号将出现在 OrderTotal字段旁边,因此你将知道它是一个计算域。

为计算所得的columns计算 OrderWeightTotal OrderName,并为各自的方法使用下列代码:

partialvoid OrderWeightTotal_Compute(refdouble result)
{
 double dblWeightTotal = 0;
 // Get OrderDetails that have productsvar colOrderDetails = from OrderDetails inthis.OrderDetails
 where OrderDetails.Product!= nullselect OrderDetails;
 foreach (var order in colOrderDetails)
 {
 dblWeightTotal = dblWeightTotal + 
 (order.Quantity * order.Product.ProductWeight);
 }
 result = dblWeightTotal;
}partialvoid OrderName_Compute(refstring result)
{
 if (this.Customer!= null)
 {
 result = String.Format("{0} [{1} {2}]", 
 this.Customer.CustomerName, this.OrderStatus, 
 this.OrderDate.ToShortDateString());
 }
}

收费的table 像上面的图片。

尽管我们可以创建( 我们将在以后的步骤中创建屏幕) 屏幕上的代码来做相同的事情,但实体( 表格) 是这个代码的正确位置:

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

验证代码

验证代码的目的是防止实体记录在不满足特定规则的情况下保存或者更新。 注意,验证代码一次只能在一个实体上运行,但"规则"可以基于多个实体的数据。

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

打开OrderDetail单位,点击。 在属性中,单击自定义验证。

你将看到一个方法,它只是要求你向结果集合中添加一个 PropertyError。 出现错误将阻止实体被保存,错误将显示。

将该方法更改为:

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

"this是保存的实体。 我们只是检查一下 Quantity 是否为 GREATER 的。

现在,我们将查看实体验证:

打开OrderDetail单位,并选择编写代码,然后为 OrderDetails_Validate。

将以下代码用于该方法:

partialvoid OrderDetails_Validate(OrderDetail entity, 
 EntitySetValidationResultsBuilder results)
{
 // Total for order cannot be over $100if (entity.Order.OrderTotal >100)
 {
 results.AddEntityError(String.Format(
 "Total order cannot be over $100.00"));
 }
 // Weight for order cannot be over 10 lbsif (entity.Order.OrderWeightTotal >10)
 {
 results.AddEntityError(String.Format(
 "Total Weight for order cannot be over 10 lbs"));
 }
}

订单中选择 Orders_Validate 方法。

将该方法更改为:

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

,LightSwitch由于它使用选择 List,LightSwitch会自动创建 字段的下拉框,但是你仍然可以重写它,并将它的改为文本字段。 在这种情况下,你需要这个验证。

预处理查询

预处理查询允许我们更改用于访问数据的查询。 执行普通查询,但是任何预处理方法都会向查询添加一个附加约束。 在本示例中,我们将使用它来:

  • 允许公司( 非管理员) 查看并仅放置订单。

实际上,如果用户不是管理员,我们将只应用预处理查询。 我们将将这里查询应用于将为公司访问的实体,如果它们登录到应用程序:

  • 客户
  • 订单
  • 订单明细

我们将阻止客户/公司访问公司的屏幕( 我们将在以后的步骤中创建)。 还要注意,尽管我们不允许客户看到主公司屏幕,我们需要设置安全性才能显示客户记录。

这是一个学习"在LightSwitch的方式里"的例子。 你希望尽可能在实体级别实现业务规则和安全性。 以后创建的任何屏幕或者下拉列表都将自动遵循你创建的规则。 这样可以节省大量时间,使最终应用程序比在屏幕上显示 List 或者下拉代码时更稳定。更健壮。

打开 实体并选择 Orders_All_PreProcessQuery

将该方法更改为:

partialvoid Orders_All_PreprocessQuery(ref IQueryable<Order> query)
{
 // This will run if the user is not an Administratorbool 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实体执行相同步骤:

partialvoid OrderDetails_All_PreprocessQuery(ref IQueryable<OrderDetail> query)
{
 // This will run if the user is not an Administratorbool 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);
 }
}

客户实体( Customers_All_PreprocessQuery ) 执行相同的步骤:

partialvoid Customers_All_PreprocessQuery(ref IQueryable<Customer> query)
{
 // This will run if the user is not an Administratorbool 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

打开一个实体并选择。

屏幕数据选择 Editable Editable template模板,并选择客户。

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

选择编写代码,然后选择 EditableCustomerGrid_CanRun

将该方法更改为:

partialvoid EditableCustomersGrid_CanRun(refbool result)
{
 // User must be an Administrator result = this.User.HasPermission(Permissions.SecurityAdministration);
}

执行相同的步骤为的产品实体创建屏幕。

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

partialvoid EditableProductsGrid_CanRun(refbool result)
{
 // User must be an Administrator result = this.User.HasPermission(Permissions.SecurityAdministration);
}

For订单实体,选择 Screen Details Screen模板,并选择订单 Screen Screen Data和订单详细信息Additional订单 Include。

我的代码在哪里?

你可能会把代码放在不同地方会有点紧张。 你可能想知道如何轻松找到在LightSwitch项目中创建的定制代码。 这不是问题。

解决方案资源管理器中,选择文件视图。

选择显示所有文件

你将很容易地找到你在模块文件夹中编写的所有自定义代码。

运行应用程序

至此,我们已经完成了应用程序的创建。 如果你是专业开发人员,冷冷刚刚穿过你的身体,你就不孤独了。 放心,在创建LightSwitch程序时仍然需要一个专业的开发者,如在这个链接中所描述的

在运行应用程序之前,让我们先看看我们将要使用的用户。 进入属性

访问控制选择,并确保为调试所授予的为 SecurityAdministration。 当我们以调试模式运行项目时,我们将是一个用户名为的用户。 那个用户将成为管理员,当我们选中那个框。

后来,我们可以取消选择这个框,我们将能够看到正常客户在运行应用程序时会看到什么。 因为用户必须在用户 table 中拥有帐户,因为在调试模式下运行LightSwitch应用程序时,这就是你一直在使用的。

点击以构建和运行应用程序。

你将自动登录为 TestUser。 在部署应用程序时,屏幕上会显示一个日志。

我们输入两个客户,确保其中一个用户是""。

确保按了保存按钮以保存数据。

请输入一些产品。

当我们转到 List screen屏幕时,可以单击大绿色加号按钮打开添加新订单菜单。

我们已经注意到了,但是在我们的部分中,我们已经为我们创建了多少

我们可以将订单细节添加到订单

如果停止程序并取消选中 Debug Debug Granted,然后再次按

我们看到,我们只能看到订单,而我们只能看到并放置订单。

部署程序

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

Visual Studio 中,选择构建,然后 配置管理。

更改为发布模式( 如果你不这样做,你会看到"屏幕设计"已经部署应用程序中的框)。

Visual Studio 中,选择构建。然后发布 OnlineOrdering。

选择收费的网站。

选择 IIS。

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

输入你先前创建的SQL Server 帐户。

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

你可以单击 specify specify specify指定证书 page。

单击发布

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

因为这个用户是管理员,所以它可以在菜单看到管理。 点击用户

你将可以创建其他用户。

当你在用户屏幕 make,确保用户在收费的用户屏幕上创建了的用户 NAME MATCHES。

如果你关闭web浏览器并作为你创建的用户登录,你将看到用户只能放置和查看自己的订单。

所有的业务验证也将工作。

你不能把精灵放回瓶子里。

如果你是专业的开发者,你必须接受事实,事情已经彻底改变了。 六个计算预算的日期将使半数开发人员在工厂的LOB应用程序上运行几周。 虽然有些项目仍需要昂贵的定制HTML前端,但大多数应用都是"返回 Office 内容",并且可以在days的developer developer

好消息是,LightSwitch主要用于替换目前在Excel中手工完成的项目。 forms-over-data应用市场刚刚变得更大了。 然而,可以在LightSwitch中完成的任何项目都可以用 75% +的时间和成本来完成。 竞争的唯一方法是在合适的地方使用 LightSwitch。

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


SYS  系统  Light  ord  lights  lightswitch  
相关文章