使用 URI 设计松散耦合的 Metro 应用程序

  • Jonathan Allen
  • 高翌翔

2011 年 9 月 19 日

话题:.NETJavaScriptC++HTML5语言 & 开发架构

Metro 风格应用程序意味着小型且高度集中。对于我们传统上为企业建立的、大规模的、单一的应用程序而言,我们可把它们重新想象成工作流的特定工具。例如,你可能使用某款股票交易应用程序中的工具来查找并查看客户基本信息,而使用另一款应用程序来研究金融产品。无论来自这些模式中的任何一种,然后你就要跳到“购买股票”的工作流,此工作流可能位于一款完全不同的应用程序中。

在 Metro 中借助协议(protocols)的方式,你同样可完成这一切。对于我们上述的例子,此协议可能形如“acme-stock-purchase://client=123&stock=XYZ”。在安装时,该股票购买工具应被注册以便监听发送到“acme-stock-purchase”协议的消息。当发生此情况时,股票购买工具会被启动,并接收指定的参数。

用于处理这一切的代码相当容易编写,而且在基于 C++、.NET、及 JavaScript 的应用程序中都是可用的。以下代码摘录展示了 C++应用程序侦听 OnActivated 和 OnFileActivated 事件。当通过已注册的文件类型启动应用程序时会触发 OnFileActivated 事件。


void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ args)
  {
    Window::Current->Content = ref new MainPage(true);
    Window::Current->Activate();
  }

  void App::OnFileActivated(Windows::ApplicationModel::Activation::FileActivatedEventArgs^ args)
  {
    MainPage^ page = ref new MainPage(false);
    page->SelectScenario3(args->Files->GetAt(0)->Name);
    Window::Current->Content = page;
    Window::Current->Activate();
  }

  void App::OnActivated(Windows::ApplicationModel::Activation::IActivatedEventArgs^ args)
  {
    MainPage^ page = ref new MainPage(false);
    if (args->Kind == Windows::ApplicationModel::Activation::ActivationKind::Protocol)
    {
        Windows::ApplicationModel::Activation::ProtocolActivatedEventArgs^ protocolArgs = dynamic_cast<Windows::ApplicationModel::Activation::ProtocolActivatedEventArgs^>(args);
        page->SelectScenario4(protocolArgs->Uri->RawUri);
    }
    Window::Current->Content = page;
    Window::Current->Activate();
  }

此类通讯是单向的,源(source)应用程序无法知道目标(destination)应用程序将如何处理消息。尽管这限制了你的一些设计选择,但是它保持了各种工具之间的松散耦合。当你的公司业务需求发生变化时,可以更新单独的工具,而无需重新部署整个软件栈。

由于这些都是 URI[1],因此它们不必由另一 Metro 应用程序来触发。任何有能力使用“http://sample.com”去启动 web 浏览器的应用程序都可以启动任何一款已启用协议(protocol-enabled)的 Metro 应用程序。同样,用户还可以将 URI 简单地粘贴到 Run 菜单中、或是任一资源管理器或 IE 浏览器的地址栏中。这使得开发者可将遗留程序、网络、以及 Metro 应用程序三者轻松地集成在一起。

译注

[1] URI,统一资源标识符,即 Uniform Resource Identifier 的缩写,是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对网络中(一般指万维网)的资源通过特定的协议进行交互操作。URI 由包括确定语法和相关协议的方案所定义。详见统一资源标识符

查看英文原文:Designing Loosely Coupled Metro Applications with URIs

.NETJavaScriptC++HTML5语言 & 开发架构