C# 可移植类库和WebBrowserTask vs Windows.System.Launcher

C# 可移植类库和WebBrowserTask vs Windows.System.Launcher,c#,windows-store-apps,launcher,portable-class-library,C#,Windows Store Apps,Launcher,Portable Class Library,我假设答案是否定的,但以防万一。。。有没有办法在PCL中执行特定于平台的代码 我的具体示例非常适合PCL。使用profile104(WP7/Windows Store/Net40)完全支持绝大多数代码。平台特有的唯一一点是启动深度链接的能力: my-custom-protocol://some/url 非共享代码为: On WP7, it would be: WebBrowserTask web = new WebBrowserTask(); web.Uri =

我假设答案是否定的,但以防万一。。。有没有办法在PCL中执行特定于平台的代码

我的具体示例非常适合PCL。使用profile104(WP7/Windows Store/Net40)完全支持绝大多数代码。平台特有的唯一一点是启动深度链接的能力:

my-custom-protocol://some/url
非共享代码为:

On WP7, it would be:
        WebBrowserTask web = new WebBrowserTask();
        web.Uri = BuildUrl();
        web.Show();

On WP8 and Windows Store it would be:
        Windows.System.Launcher.LaunchUriAsync(BuildUrl());

On Net40, I guess you would host a web-browser control.
因此,公共库提供了定制的“任务”对象,这些对象提供了“BuildUrl()”的实现。问题是,在受支持的设备上,您希望启动“我的自定义”-protocol://some/url,但在任何其他设备上,您都希望转到web回退。这一切都包含在:

        new CustomTask(data).Show()
  • 选项1(当前实现):不要使用PCL,在CustomTaskBase类中使用#ifdef来包含平台细节。但是,我真的不想维护特定于平台的项目文件,并将cs文件添加为链接:-(

  • 选项2:只需将启动器放在特定于平台的程序集中,所有其他代码都放在PCL中。同样,我不喜欢这样,因为它似乎需要大量维护,并且不会减少我们的项目数量。这还意味着客户端需要引用两个程序集,而不是一个程序集,对于一些自定义任务来说,这似乎有些过分

  • 选项3:将一个抽象的IPlatformSpecificLauncher注入启动器的构造函数,然后该构造函数将成为一个URLBuilder。这会将启动代码移动到客户端,这将是复制粘贴(虽然很小)。但是这会使API复杂化,使其可读性降低

        new CustomTask(new WP8Launcher(), data).Show()
    
  • 选项4:更改API,以便CustomTask只返回要启动的URL(并且在客户端中再次包含启动代码)。但是,您将如何在不支持自定义协议的设备上实现web回退?您不能说PCL中是否有(platform==WP7),可以吗


提前感谢您提供的任何提示和提示!

对于PCL中依赖于平台的功能,答案显而易见(除了放弃)是某种依赖注入,或者使用服务定位器。在我看来,您的示例总体上是DI的一个很好的使用,甚至忽略了PCL的实际限制-您实际上插入了不同的行为

“平台启蒙”ala RX是另一种方法(所有这些方法的良好概述),其中PCL通过反射加载附加组件

在任何一种情况下,你都会增加项目数量。我认为有一种观点认为,尽可能多地投入PCL,并将特定于平台的功能分离成单独的小块,比从多个项目链接而来的大型共享库更干净,因为共享和#if条件代码之间的区别很小很明显


至于“你能说if(platform==WP7)”这个问题,你的PCL不能包含平台条件代码,尽管PCL可以针对所有包含所需功能的平台子集。

回答不错。我从未听说过“平台启示”这是一篇很好的文章:回答得很好。@JonRea:对于需要引用两个程序集的客户,您可以将所有内容打包成一个可以作为单个单元引用的NuGet包。@Daniel-是的,我们在内部使用NuGet。这是一个很好的工具。这个启示听起来像一个计划:-)我已经做了一个小的演示项目-它工作得非常好。如果您感兴趣,可以在此处获取代码: