用 Visual Studio LightSwitch 构建新式业务生产力应用程序
在本文中,我们将探讨 Visual Studio LightSwitch 中的一些新功能,这些功能可帮助您构建新式移动业务生产力应用程序。
Visual Studio LightSwitch(以下简称 LightSwitch)旨在简化并缩短业务应用程序的开发过程。 LightSwitch 应用程序可使用多种数据源、提供业务和授权逻辑以及创建可在多种设备上运行的客户端,而所有这些都不需要编写管道代码。
LightSwitch 可聚合多种数据源,并且它自动公开一组开放数据服务(开放数据协议,简称 OData)以支持自定义客户端和自助商业智能 (BI) 方案。 通过 LightSwitch 还可编写代码以按需自定义应用程序,无论是 UI 控件、业务逻辑、数据服务或其他组件均可。
四月发布 Visual Studio 2012 Update 2 后,LightSwitch 还可快速生成适合触摸并在新式移动设备上运行良好的 HTML5 客户端。 LightSwitch HTML 客户端以符合标准的 HTML5 和 JavaScript 构建而成,可在 Windows RT、Windows Phone 8、iOS 版本为 5 和 6 的 iPhone 和 iPad 以及 Android 4.x 设备上提供触摸优先的新式体验。
此外,通过新的 SharePoint 2013 应用程序模型,LightSwitch 还可在 SharePoint 和 Office 365 中轻松方便地构建自定义业务应用程序。 当今有许多企业使用 SharePoint 作为一个中枢以改善人员、内容和流程之间的协作。 尽管仍可自行或在 Windows Azure 中托管应用程序,但在 LightSwitch 应用程序中启用 SharePoint 后,可利用 SharePoint 中的应用程序生命周期管理、标识和访问控制功能,更不用说企业中已在 SharePoint 中运行的业务数据和流程。
LightSwitch HTML 客户端
在 LightSwitch 中始终以数据模型开始,无论是为新数据建模还是连接到现有的数据源都是如此。 由于在本文中我们主要介绍新功能,因此我们已创建了一个简单的数据模型,并向数据库填入了一些初始数据。 这样,即做好全部准备,可开始创建一个客户端,而使用它可确保在参加重要会议(如 Visual Studio Live)时列席最令人感兴趣的场次! 如果这是您首次接触 LightSwitch,那么务必阅读 MSDN 杂志过往的文章,如 2012 年九月号的“用 Visual Studio LightSwitch 2012 进行数据整形”(msdn.microsoft.com/magazine/jj618303),或查看 LightSwitch 开发中心 (msdn.com/lightswitch),从而确保不会错过其可提供的大量数据建模、自助 BI、并发处理和多线程功能。
HTML 客户端提供一种构建触摸优先的单页应用程序的方法,此类应用程序可在大量移动设备上运行,一般称为“辅助应用程序”,以表示这些应用程序仅在更大的体系结构中发挥一种特定的作用。 创建此类辅助应用程序以现场浏览数据(正如我们在本文中所做)是 HTML 客户端入门的一个良好练习,但无法体现这些应用程序可解决的问题范围之广。 这些辅助应用程序不仅可查阅数据,还可修改和存回数据(例如,递送包裹时收集客户的签名),有时甚至还可利用地理位置等设备特定功能(例如,采集土壤样本的地点),从而帮助贵公司节省时间和资金。
屏幕模板和导航:无论创建何种类型的客户端,LightSwitch 均采用同一方法定义屏幕,即使用一组可选择的预定义模板。 若要添加屏幕,只需在“解决方案资源管理器”中右键单击项目,然后选择“添加屏幕”选项即可。 此操作将打开一个对话框,从中可选择屏幕模板和一些其他选项,如屏幕的名称以及该屏幕将使用的数据。 随后将根据所选模板生成此屏幕,并在屏幕设计器中打开它。
对于有些经验的 LightSwitch 开发人员,这已经让人感到比较熟悉,因为设计时体验几乎与使用 LightSwitch 在浏览器内外的 Silverlight 应用程序中创建屏幕完全一样,从而简化已经比较轻松的学习过程。 LightSwitch 遵循应用程序底层的模型-视图-视图模型 (MVVM) 体系结构以及屏幕设计器在左侧显示视图模型,在右侧显示对应视图的某种表现形式这一方式。
一个值得注意的变化是设置从一个屏幕到另一个屏幕的导航(或将任何其他操作绑定到因用户点击屏幕上的元素而导致的事件)已真正成为屏幕设计器中的头等大事。 这是一种明显的进步,不仅因为应用程序如此侧重于触摸,还因为 LightSwitch HTML 客户端可生成单页应用程序 (SPA)。 Silverlight 客户端具有一个多文档界面 (MDI) 外壳,可同时打开许多屏幕,因此,在 LightSwitch HTML 应用程序中,在不同屏幕间导航逐渐变得更加重要。
例如,如果对场次实体使用“浏览数据”模板以创建此应用程序中的第一个屏幕,则将生成一个含有场次列表的屏幕。 (将在屏幕设计器中选择此列表,然后在“属性”窗口中单击“Edit Item Tap Action”(编辑项点击操作)链接。) 此操作将打开一个对话框,其中自动根据情况给出建议: 由于用户正在浏览场次并已点击某项,因此该对话框建议进行打开屏幕的操作,用户在该屏幕中可查看所选场次的详细信息。 由于尚未创建屏幕,因此该对话框还建议您创建该屏幕。 如图 1 所示。
图 1:设置触摸事件的操作现在是屏幕设计器中的头等大事
接受之后,按 F5 即生成应用程序,并在默认浏览器中启动一个新的调试场次。 随后将打开主屏幕,其中显示一个简单的场次列表。 点击某个场次时,应用程序将平滑地导航到新生成的详细信息屏幕,其中以简单的两列布局显示该特定场次的详细信息,如图 2 所示。
图 2:自适应设计帮助只需编写一个应用程序即可用于多种外观尺寸
虽然此屏幕看起来很简单,但幕后还有许多事情要做。 这个“简单的场次列表”实际上由一个完全虚拟化的集合提供支持,该集合在用户向下滚动时加载更多元素,以避免不必要地通过移动连接传输大量数据。 两列布局动态自适应可用大小,在较小的设备上将变为单列布局。 在编写单页 HTML 应用程序并在多种平板电脑和手机(每种的外观尺寸均不同)上运行它的策略中,这是一个重要的决定因素。 计划经理 Heinrich Wendel 撰写的 Visual Studio LightSwitch 团队博客文章“针对多种外形尺寸进行设计”(bit.ly/18F320N) 更加详细地介绍这种自适应设计背后的理念,这种设计通常需要开发人员做许多工作,但通过 LightSwitch,只需极少的工作量即可做到。
屏幕设计器中其他值得注意的要素包括提倡使用弹出窗口和选项卡,两者都有自己的命令栏。 两者可为最终用户提供便利的一个示例是添加场次的筛选器。 为此,请先选择视图模型中的“Sessions”(场次)查询元素(屏幕设计器的左侧),然后单击“Edit Query”(编辑查询),此操作将打开查询编辑器,从中可通过添加一些可选参数,快速修改所使用的查询。 接下来,点击“Add Data Item”(添加数据项)按钮以添加一个名为 FilterBySpeaker 的本地 Speaker 属性,设置此 Speaker 的 ID 对相应查询参数的绑定,然后对其他实体重复此过程: 房间、时间段和音轨。
若要完成此屏幕,只需将这四个新的视图模型属性拖至在视图中新创建的弹出窗口上(屏幕设计器的右侧)。 默认情况下,LightSwitch 将建议将每个属性可视化为一个 Modal Picker 控件,而这对于此应用程序尚可。 最后,向命令栏添加一个新按钮,并使用在设置“Edit Item Tap Action”(编辑项点击操作)时出现的同一对话框打开新创建的弹出窗口。
只需点击“Save”(保存)并刷新浏览器即可查看新添加并起作用的筛选器(JavaScript 不需要重新编译,而传统的 Microsoft .NET Framework 应用程序需要)。 随后将打开主屏幕,其中显示一个虚拟化集合中的所有场次,并且这次还显示一个蓝色的命令栏,其中有一个“Filter”(筛选)按钮。 在各种不同的设备上,单击此按钮后,将出现一个弹出窗口,其中显示四个筛选器选项(如图 3 所示)。 实际做出选择后,即自动因数据绑定而更新可选的查询参数。 而这转而自动触发将一个新的 HTTP GET 操作发送到后端 OData 服务,后者按正确参数筛选场次并返回结果。
图 3:添加后起作用的筛选器
总的来说,屏幕设计器可很好地完成进行正确抽象的工作,因此您可集中精力建立专业的 HTML 应用程序,而将工作量降到最低。 例如,此应用程序包括一个可筛选的虚拟化列表,不必编写一行代码即已设置其中各项。
但是,注意,作为开发人员,您不应过于痴迷这种无代码哲学。
没错,屏幕设计器着重将实际技术抽象化以加快开发人员的速度,但与所有快速应用程序开发 (RAD) 环境一样,这意味着将失去一定程度的可自定义性。 但是,LightSwitch 在屏幕设计器中提供许多方案以及大量扩展点,因此可着手重写、更改形成应用程序的 HTML、JavaScript 和 CSS 混合代码或向其追加内容。
举例而言,可向应用程序添加一个新查询,该查询以屏幕上数据项的形式仅返回下一时间段的那些场次,然后将该查询拖至主屏幕中的某个新选项卡上。 仍可保留列表控件以显示场次,但不再每个场次都有一行摘要(标题),而是使用屏幕设计器嵌套某些行列布局并显示有关场次的某些其他信息,而这产生图 4 中的第一个(左侧)布局。
图 4:主屏幕的三种不同设计
品牌、主题和进一步自定义:当开始在自定义代码中混合内容时,可迅速轻松地应用某些全局主题和品牌。 实际上,徽标就是可从 Windows 资源管理器中替换的一个 .png 文件,而主题就是一个标准的 JQuery Mobile 主题。 LightSwitch 附带一个浅色(默认)和一个深色主题,两者均可使用在线 JQuery Mobile ThemeRoller 进行进一步修改。 同时更改徽标和主题即产生图 4 中的中间布局。
最后,可使用 Render 或 PostRender 方法进一步定义应用程序的外观。 在屏幕设计器中选择任何 LightSwitch 控件后,“属性”窗口中即出现一个标有“Edit PostRender Code”(编辑 PostRender 代码)的链接。 单击此链接后,将紧接着已呈现特定控件的必要 HTML 元素的 LightSwitch JavaScript 库之后生成一个将在运行时执行的 JavaScript 方法存根。 此扩展点可用于通过在该方法中编写以下代码,根据场次所属的音轨,更改列表中每行的背景:
myapp.Home.NextSessionsTemplate_postRender =
function (element, contentItem) {
$(element).parent("li").css("background",
contentItem.value.Track.Color);
};
这段代码获取 LightSwitch 添加的 HTML 元素的父级,并将 CSS background 属性设置为当前场次所属音轨的颜色 (contentItem.value),从而产生图 4 中最右侧的布局。
图 4 揭示了设计中一个明显的错误: 如果音轨关联了一种浅色,则由于内容与背景之间的对比,将无法看清该项。 若要纠正这一点,请向 user-customization.css 文件添加两个可重用的 CSS 类并更改代码,使其追加其中某个类:
myapp.Home.NextSessionsTemplate_postRender =
function (element, contentItem) {
$(element).parent("li").css("background",
contentItem.value.Track.Color);
$(element).addClass(
(parseInt(contentItem.value.Track.Color.replace(
"#", ""), 16) > 0xffffff / 2)
? 'darkForeground' : 'lightForeground'
);
};
通过编写 PostRender 方法自定义呈现过程的方式可用于多种选项,从更改背景颜色等简单 CSS 技巧到应用隐藏列表中一项之外所有项的可重用 JQuery UI 小组件,从而将列表变为动态横幅或图像轮播。 通过所设置的计时器更改可见项,如博客文章(由 Jan Van der Haegen 合著)“创建用于 LightSwitch HTML 页面的 JQuery 滑块”(bit.ly/WJwnPw) 所述。
将即将召开的场次的列表变为背景经过着色的横幅之后,容易忘记哪个音轨是哪种颜色。 除了使用此 PostRender 选项更改标准 LightSwitch 控件之外,还可完全控制特定元素的整个呈现过程,方法是在屏幕设计器中指示这些元素为自定义控件,然后在所产生的相似 JavaScript Render 方法中自行编写代码。 若要添加音轨的图例及其颜色代码,请向屏幕视图模型以日期项形式添加对所有音轨的查询,然后显示该查询作为磁贴列表(一种内置的备用集合控件)。 在每个磁贴的模板中,使用下面这段 JavaScript 代码将每个音轨的颜色呈现为一个简单的正方形:
myapp.Home.Color_render = function (element, contentItem) {
$("<div style='background-color: "+ contentItem.value
+";'> </div>").appendTo($(element));
};
除了多种可视自定义,LightSwitch 还在视图模型和模型层中提供许多代码扩展点,以帮助您微调应用程序的控制流和业务规则。
现在,此应用程序的第一个选项卡上是即将召开的场次(以横幅的形式),每个音轨有一个颜色图例,而第二个选项卡概述所有场次,包括一个易用的筛选器。 由于主屏幕已显示所有音轨,因此最好在用户点击第一个选项卡中的某个音轨时填充第二个选项卡上的筛选器,然后使此选项卡仅显示所选音轨中的场次。
无法直接从屏幕设计器中设置此控制流,但通过选择音轨的磁贴列表以及在“属性”窗口中将要执行的项选项卡绑定到某个自定义方法,可轻松实现这一点。 此操作生成一个 JavaScript 方法存根,从中可编写以下内容:
myapp.Home.BrowseByTrack_ItemTap_execute = function (screen) {
screen.getTracks().then(function (tracks) {
screen.FilterByTrack = tracks.selectedItem;
screen.showTab("AllSessions");
});
};
该应用程序现在有三个不同的角度可划分场次: 查看横幅中即将召开的场次;单击某个音轨以查看由该音轨筛选的场次的列表;或手动根据该同一筛选器调整音轨、时间段、发音人或房间。
可添加的最后一个角度是收藏场次的概述。 为此,请添加一个名为 FavoriteSessions 的简单实体。 收藏场次是其中以特定名称存在 FavoriteSessions 中某个条目的那些场次。
打开查看特定场次的屏幕时,请通过异步执行对服务器的专用 FindFavoriteSessions 查询,然后将是否存在此结果存储到一个名为 IsFavorite 的布尔值屏幕属性中,判断是否存在此类条目:
myapp.ViewSession.created = function (screen) {
myapp.activeDataWorkspace
.ApplicationData.FindFavoriteSessions(screen.Session.Id)
.execute().then(
function (result) {
screen.IsFavorite = result.results.length != 0;
}
);
};
然后向选项卡的命令栏添加两个按钮: Favorite(收藏)和 Unfavorite(取消收藏)。 其中同时只能有一个按钮处于活动状态,因此使用按钮的 CanExecute 代码扩展点。 LightSwitch JavaScript 库在适当的时间调用这些方法,并确保相应地更新 UI。 虽然可从“属性”窗口中取代每个屏幕的此行为,但默认情况下通过隐藏当时无法执行的按钮而这样做,从而节省小型设备上宝贵的屏幕空间:
myapp.ViewSession.Favorite_canExecute
= function (screen) {
return !screen.IsFavorite;
};
myapp.ViewSession.Unfavorite_canExecute
= function (screen) {
return screen.IsFavorite;
};
此类简单代码段令人惊叹的一大亮点是 LightSwitch JavaScript 库持续跟踪何时应重新计算这些 CanExecute 方法。 如同在 Silverlight 浏览器外应用程序中一样,在属性变化时不需要担心引发事件。 只需在应用程序中为 IsFavorite 属性设置一个新值,LightSwitch 运行时就会自动了解要重新计算这些特定的 CanExecute 方法并更新视图(显示或隐藏按钮)。
现在只需编写一些在单击按钮时创建新 FavoriteSession(或删除它)的代码:
myapp.ViewSession.Favorite_execute = function (screen) {
var favored = myapp.activeDataWorkspace.ApplicationData.
FavoriteSessions.addNew();
favored.setSession(screen.Session);
myapp.applyChanges().then(screen.IsFavorite = true);
};
将 FavoriteSession 的列表添加到主页上的新选项卡之后,应用程序即准备好进行打包和部署。
事实证明,LightSwitch 在从简单而又强大的屏幕设计器中设计应用程序与为此简化和快速的开发而需要在可自定义性方面做出的牺牲之间取得了良好的平衡。 为此,它引入了大量扩展点,从中可编写自定义代码以更改、取代或追加应用程序的默认设计、控制流或行为。
与 SharePoint 2013 和 Office 365 集成
SharePoint 2013 引入了一种基于云的新型应用程序模型,该模型使您可创建扩展 SharePoint 网站功能的应用程序,并支持分层体系结构,可将应用程序的业务逻辑、数据和 UI 分布在其中。 用户从 Office 应用商店或从其所在组织的私有应用程序目录中查找并下载应用程序,然后将这些应用程序安装到其 SharePoint 网站上。 由于这个新的分布式模型,因此可构建面向内部部署和 Office 365 上 SharePoint 2013 的 LightSwitch 应用程序。 可将 LightSwitch Silverlight 浏览器内客户端或新式移动 HTML 客户端部署到 SharePoint 中。
以 Visual Studio Live! 示例为基础进行构建时,可利用 Office 365 服务,使会议工作人员可在 LightSwitch 应用程序中使用 SharePoint 日历制订会议日程。 当批准新场次并选择时间段后,此操作将添加一个新的日历条目。 随后即可设想一系列可采用的工作流,这些工作流可触发与 SharePoint 共有的其他操作。 因此,通过 LightSwitch 应用程序可创造支持触摸的体验,其中利用业务中已在 SharePoint 中运行的业务数据和流程。
在 LightSwitch 应用程序中启用 SharePoint:在项目属性中,单击“启用 SharePoint”按钮,然后提供要用于开发的本地或远程 SharePoint 2013 网站。 这样做时,即向 LightSwitch 告知应将应用程序部署到 SharePoint,并且应用程序可使用 SharePoint 资产。 此操作将相应的 SharePoint 引用添加到项目。
LightSwitch 还可通过 OAuth 自动为您处理向 SharePoint 的身份验证。 可配置访问控制服务 (ACS),这是另一个在应用程序与 SharePoint 之间协调身份验证的服务器。 应用程序将某项“机密”告知 SharePoint,并可使用它通过 ACS 进行身份验证,Office 365 就是这样。 还可选择高信任配置(如果在内部部署设置了该配置),如图 5 所示。
图 5:在 LightSwitch 应用程序中启用 SharePoint
若要迅速开始开发 SharePoint 应用程序,可在 dev.office.com 上进行注册以免费试用 Office 365 开发人员订阅。 MSDN 订阅者还可通过其订阅利益网站免费注册一年。
SharePoint 列表作为 LightSwitch 实体:可使用数据设计器,将 SharePoint 列表以实体的形式引入 LightSwitch 数据模型。 这样即可直接通过 LightSwitch 数据上下文操纵列表数据。 这意味着可直接对照已设置的 SharePoint 列表数据创建屏幕,而 LightSwitch 将自动处理身份验证和数据操作。 例如,在 Visual Studio Live! 方案中,任何数据均可存储在 SharePoint 列表中,而 UI 不会更改。
将 SharePoint 列表引入 LightSwitch 数据模型后,还可使用 LightSwitch API 简便地通过代码访问列表数据。 例如,在 Visual Studio Live! 应用程序中,我们要编写代码以在添加新场次时自动添加一个 SharePoint 日历条目。 为此,请右键单击“解决方案资源管理器”中的“Server”节点并选择“Add Data Source”(添加数据源),然后选择“SharePoint”作为数据源类型。 在指示 SharePoint 网站地址并决定自动选择用户标识之后,将显示 SharePoint 列表。
所使用的网站已包含一个名为 ConferenceSchedule 的日历。 将此引入数据模型后,即可与场次表数据建立虚拟关系。 只需单击数据设计器顶部的“Relationship”(关系)按钮,然后定义一对零或一的关系(见图 6)。
图 6:在多个数据源之间建立虚拟关系
现在可创建一个新屏幕,工作人员从中可输入新场次。 可直接在屏幕上加入 ConferenceSchedule 数据,但在这种情况下,将编写一些服务器代码,以使其因此在后台透明地出现。 保存场次数据后,对 Session 实体使用保存管道的 _Inserting 和 _Updated 方法以使用 Visual Basic .NET 或 C# 代码从服务器向日程表添加新条目(分别见图 7 和图 8)。 服务器上有许多挂钩使您可这样控制业务逻辑和数据处理。
图 7:使用 Visual Basic .NET 向 SharePoint 日历添加新条目的代码
Private Sub Sessions_Updated(entity As Session)
Me.UpdateCalendar(entity)
End Sub
Private Sub Sessions_Inserting(entity As Session)
Me.UpdateCalendar(entity)
End Sub
Private Sub UpdateCalendar(entity As Session)
If entity.Timeslot IsNot Nothing AndAlso
entity.Room IsNot Nothing Then
If entity.ConferenceSchedule Is Nothing Then
entity.ConferenceSchedule = New ConferenceSchedule()
End If
entity.ConferenceSchedule.Title = entity.Title
entity.ConferenceSchedule.Description = entity.Description
entity.ConferenceSchedule.StartTime = entity.Timeslot.StartTime
entity.ConferenceSchedule.EndTime = entity.Timeslot.EndTime
entity.ConferenceSchedule.Location = entity.Room.Name
Me.DataWorkspace.VSliveData.SaveChanges()
End If
End Sub
图 8:使用 C# 向 SharePoint 日历添加新条目的代码
private void Sessions_Updated(Session entity)
{
this.UpdateCalendar(entity);
}
private void Sessions_Inserting(Session entity)
{
this.UpdateCalendar(entity);
}
private void UpdateCalendar(Session entity)
{
if (entity.Timeslot != null && entity.Room != null)
{
if (entity.ConferenceSchedule == null)
{
entity.ConferenceSchedule = new ConferenceSchedule();
}
entity.ConferenceSchedule.Title = entity.Title;
entity.ConferenceSchedule.Description = entity.Description;
entity.ConferenceSchedule.StartTime = entity.Timeslot.StartTime;
entity.ConferenceSchedule.EndTime = entity.Timeslot.EndTime;
entity.ConferenceSchedule.Location = entity.Room.Name;
this.DataWorkspace.VSliveData.SaveChanges();
}
}
在调试应用程序 (F5) 时,将首先询问您是否信任该应用程序。 确认后,将在顶部看到一个 SharePoint 版式控件,使用户可从 LightSwitch 应用程序向上导航到 SharePoint 网站。 添加新场次,然后单击版式中的“Back to site”(返回网站)以查看 Conference Schedule(会议日程)。 如果单击“事件”项,则将看到 LightSwitch 应用程序代表用户创建了该项。 此操作显示自动流过 LightSwitch 应用程序的 SharePoint 用户凭据。
SharePoint 项目和客户端对象模型:将列表用作实体不是访问 SharePoint 数据的唯一方法。 在 LightSwitch 应用程序中启用 SharePoint 后,还将有完整的 SharePoint 客户端对象模型 (CSOM) 可用。 不仅可这样操纵列表,还可访问其他 SharePoint 资产。 例如,如果要创建可在 SharePoint 应用商店中销售的常规应用程序,则可能需要以更通用的方式部署和操纵 SharePoint 列表。
启用 SharePoint 时,将向 LightSwitch 解决方案添加一个 SharePoint 项目。 如果在“解决方案资源管理器”中切换到“文件视图”,即可看到该项目,如图 9 所示。 可用这种方式向应用程序添加多种 SharePoint 特有的项,将应用程序打包时将部署这些项。 然后即可使用 CSOM 在代码中操纵这些项。 例如,可向项目添加自定义列表,然后通过 CSOM 与该列表进行交互。 LightSwitch 对于可在主机和应用程序网站上获得的 Application 对象公开一个 SharePoint 对象。
图 9:通过“解决方案资源管理器”添加自定义列表和其他 SharePoint 项
例如,可向用于在添加、更新或删除场次时编写审核条目的 VSLive.SharePoint 项目添加自定义列表。 我们可通过 CSOM 再次进入保存管道并使用列表。 首先,导入 Microsoft.SharePoint.Client 命名空间,然后即可编写图 10 (Visual Basic .NET) 或图 11 (C#) 中显示的代码。
图 10:在 Visual Basic .NET 中通过 CSOM 操纵 SharePoint 列表
Private Sub Sessions_Inserted(entity As Session)
Me.LogAuditEntry(entity, "inserted")
End Sub
Private Sub Sessions_Updated(entity As Session)
Me.LogAuditEntry(entity, "updated")
End Sub
Private Sub Sessions_Deleted(entity As Session)
Me.LogAuditEntry(entity, "deleted")
End Sub
Private Sub LogAuditEntry( entity As Session, actionDescription As String)
Using ctx = Me.Application.SharePoint.GetAppWebClientContext()
Dim web As Web = ctx.Web
Dim lists As ListCollection = web.Lists
Dim auditLog As List = lists.GetByTitle("AuditList")
Dim ci As New ListItemCreationInformation()
Dim auditEntry As ListItem = auditLog.AddItem(ci)
auditEntry("Title") = String.Format("Session {0} {1}",
actionDescription,
entity.Title)
auditEntry("Name") = Me.Application.User.FullName
auditEntry("Date") = DateTime.Now
auditEntry.Update()
ctx.ExecuteQuery()
End Using
End Sub
图 11:在 C# 中通过 CSOM 操纵 SharePoint 列表
private void Sessions_Inserted(Session entity)
{
this.LogAuditEntry(entity, "inserted");
}
private void Sessions_Updated(Session entity)
{
this.LogAuditEntry(entity, "updated");
}
private void Sessions_Deleted(Session entity)
{
this.LogAuditEntry(entity, "deleted");
}
private void LogAuditEntry(Session entity, string actionDescription)
{
using (ClientContext ctx =
this.Application.SharePoint.GetAppWebClientContext())
{
Web web = ctx.Web;
ListCollection lists = web.Lists;
List auditLog = lists.GetByTitle("AuditList");
ListItemCreationInformation ci = new ListItemCreationInformation();
ListItem auditEntry = auditLog.AddItem(ci);
auditEntry["Title"] = string.Format("Session {0} {1}",
actionDescription,
entity.Title);
auditEntry["Name"] = this.Application.User.FullName;
auditEntry["Date"] = DateTime.Now;
auditEntry.Update();
ctx.ExecuteQuery();
}
}
有关将 CSOM 与 LightSwitch 配合使用的详细信息以及其他技巧和窍门,请参阅 bit.ly/16JIWn6 上 Visual Studio LightSwitch 团队博客的 SharePoint 主题。
SharePoint 部署注意事项:LightSwitch 应用程序就是 Web 应用程序,因此可将其托管在您自己的 IIS Web 服务器上或 Windows Azure 等云服务中。 安装 SharePoint 应用程序时,将安装一个清单,其中具有在何处运行应用程序的信息。 作为新 SharePoint 应用程序模型的一部分,任何包含服务器端代码的应用程序(所有 LightSwitch 应用程序都是这样)必须在 SharePoint 以外一台单独的服务器上运行。 这种隔离可提高 SharePoint 场的稳定性。
LightSwitch 支持两种类型的 SharePoint 部署: 自动托管和提供商托管。 需要在构建应用程序时考虑这些选项,因为这些选项可能直接影响数据的体系结构。
对于自动托管的应用程序,每次安装应用程序时,即自动将网站和数据库配置到 Windows Azure 中。 将数据配置到 SQL Azure 中,而将中间层配置到 Windows Azure 网站中。 这意味着装入 SharePoint 的每个 LightSwitch 应用程序实例都与其他 SharePoint 网站上的所有其他实例隔离。 这是一种快捷而简便的部署类型。 但是,如果卸载应用程序,则将删除所有内容甚至数据。
提供商托管的应用程序可灵活地托管所需的 Web 应用程序和数据库。 但是,对于此模型,所有 SharePoint 应用程序实例共享相同的中间层和数据,因此将需要自行隔离租户。 LightSwitch 在查询管道中提供行级别的筛选机制以帮助构建多租户应用程序。 还需要管理可用性 — 如果服务器停机,则所有 SharePoint 应用程序将停止工作。
还需要指定希望应用程序如何进行身份验证。 这是开始用 SharePoint 进行开发时做出的“ACS 与高信任”选择。 如果 SharePoint 服务器或场使用的是 ACS(Office 365 就是这样),则需要的只有在应用程序与 SharePoint 之间共享的客户端 ID 和机密。
使用 LightSwitch 发布向导指定这些设置并将应用程序打包。 根据托管类型的不同,它将应用程序服务和数据库部署到指定的服务器(或 Windows Azure),提供商托管就是这样,或它将所有内容打包为 SharePoint 部署包。 然后获得该包,并将其安装到 SharePoint 网站目录上。 在此处,用户可将您的应用程序添加到其网站。
有关在 SharePoint 中托管 LightSwitch 应用程序的详细信息,请参阅以下 Visual Studio LightSwitch 团队博客文章: “LightSwitch 的 SharePoint 托管和身份验证选项”(bit.ly/10vEJez) 和“将用于 SharePoint 的 LightSwitch 应用程序发布到目录”(bit.ly/11wSFqo)。
总结
如您可见,Visual Studio 2012 Update 2 中的 LightSwitch 最新版本中有众多新功能。 这些功能对于从第一版即已提供(当今仍提供)的桌面版 Silverlight 客户端加以补充。 但是,由于许多员工自带设备到工作场所,因此为每种设备构建一个原生客户端以及部署每个实现以隔离不同的应用程序商店并不现实。 LightSwitch HTML 客户端以符合标准的 HTML5 和 JavaScript 为基础构建而成,为当今的移动设备提供触摸优先的新式体验。
此外,在 LightSwitch 应用程序中启用 SharePoint 后,可利用 SharePoint 中如今已嵌入到许多企业的业务数据、流程、应用程序生命周期管理、标识和访问控制功能。
Jan Van der Haegen是一名环保极客,他喜欢边喝咖啡边开发软件。 他深爱伴侣、痴迷 .NET、热爱 LightSwitch、撰写博客、担任独立顾问和 MSDN 在线杂志的专栏作家。 私底下,他梦想有一天成为一名职业牧羊人。 可在 switchtory.com/janvan 上找到他的编写代码实验。
Beth Massi是 Microsoft 公司 Visual Studio 团队中的一名高级计划经理,并为业务应用程序开发人员社区积极做出贡献。 她经常在各种软件开发活动中发言,您可在多个开发人员网站上发现她的身影,包括 MSDN.com、Channel 9 和她的博客 bethmassi.com。 请关注她的 Twitter:twitter.com/BethMassi。
衷心感谢以下技术专家对本文的审阅: Brian Moore (Microsoft) 和 John Stallo (Microsoft)