我正在设计一个 LightSwitch 2012 应用程序来管理请求,并且我希望能够在我的所有屏幕上使用相同的可重用代码更新请求状态。例如,用户可以通过按钮调用批准屏幕、履行屏幕等更改请求状态。目前,我在每个需要更新请求的 .cs 文件中都有一个方法,使用这些partial void <ScreenCommand>_Execute()
方法。我正在尝试更改这一点,以便我可以从一个地方而不是任何地方更新代码,并且我也不想将方法复制到我添加按钮的新屏幕。现在通常我会把它放在 Application.cs 或其他具有全局访问权限的地方,但我无权访问同一个DataWorkspace
对象。我还this.DataWorkspace
从屏幕传入对象,它允许访问SaveChanges()
方法。不过,这似乎有点臭。有没有更好的方法来处理这个问题,或者有更好的地方来放置您希望能够分配给多个屏幕上的按钮的可重用命令?目前我必须非常小心地保存脏数据,而且我仍然必须手动连接所有内容。如果代码在 Application.cs 文件中,我也不知道代码是否在正确的上下文中运行。澄清一下,是的,我确实希望它在客户端运行,这样我就可以从他们的 Outlook 收件箱等触发电子邮件。
1 回答
您要做的只是良好的编程实践,将需要的代码放在多个地方,可以从每个地方调用它,但只在一个地方维护。这只是习惯于在 LightSwitch 中做事的方式的问题。
您可以在客户端项目的UserCode文件夹中的模块(或C# 中的静态类)中添加代码。这是文件夹存在的部分原因,作为放置“用户代码”的地方。为此,请切换到File View,然后右键单击UserCode文件夹以添加您的模块/类。在新创建的模块/类中添加您的方法。您可以根据需要创建任意数量的这些(如果您希望保持代码分离),或者您可以将其他方法添加到同一模块/类,这取决于您。
但是,我不会将数据工作区作为参数传递给您创建的可重用方法。我什至不会传递实体对象,只传递计算所需状态所需的值。但是数据工作区的SaveChanges方法的实际调用应该保留在屏幕的代码中。将屏幕视为“工作单元”。
在每个按钮的Execute方法中(在您的各种屏幕中),您使用屏幕中正在操作的实体的值调用您的方法并返回结果。将计算出的返回值分配给实体的State属性(如果您有的话),然后调用屏幕的Save方法(或使用屏幕的Close方法,为SaveChanges参数传递 true)。无需调用数据工作区的SaveChanges方法,并且通过这种方式执行“LightSwitch 方式”。
这样做的另一个好处是,您的代码现在可以进行单元测试,因为它不再依赖于任何实体。
我希望这一切都对你有意义。