Jon*_*Rea 4 c# launcher portable-class-library windows-store-apps
我假设答案是否定的,但以防万一......有没有办法在PCL中执行特定于平台的代码?
我的具体例子非常适合PCL.使用profile104(WP7/Windows Store/Net40)完全支持绝大多数代码.唯一特定于平台的是启动深层链接的能力:
my-custom-protocol://some/url
Run Code Online (Sandbox Code Playgroud)
非共享代码是:
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.
Run Code Online (Sandbox Code Playgroud)
因此,公共库提供自定义"任务"对象,这些对象提供"BuildUrl()"的实现.问题是,在支持的设备上,您希望启动"my-custom-protocol:// some/url",但在任何其他设备上,您要转到网络后备http://mysite.com/some/网址.这一切都包含在:
new CustomTask(data).Show()
Run Code Online (Sandbox Code Playgroud)
选项1(当前实现):不要使用PCL,并在CustomTaskBase类中使用#ifdefs来包含平台细节.但是,我真的不希望维护平台特定的项目文件,并将cs文件添加为链接:-(
选项2:将发射器放在特定于平台的组件中,将所有其他代码放在PCL中.同样,我不喜欢这样,因为它看起来很重,并没有减少我们的项目数量.它还意味着客户端需要引用两个程序集,而不是一个程序集,这对于一些自定义任务来说似乎有点过分.
选项3:将抽象的IPlatformSpecificLauncher注入Launcher的构造函数,然后该构造函数成为URLBuilder.这会将启动代码移动到客户端,这将是复制粘贴(尽管很小).然而,它确实使API复杂化并使其可读性降低.
new CustomTask(new WP8Launcher(), data).Show()
Run Code Online (Sandbox Code Playgroud)选项4:更改API,以便CustomTask只返回要启动的URL(并再次在客户端中启动启动代码).但是,如何在不支持自定义协议的设备上实现Web回退?你不能说如果(平台== WP7)在PCL,你呢?
提前感谢您的任何提示和技巧!
对于PCL中与平台相关的功能,明显的答案(除了放弃)是某种依赖注入,或者使用服务定位器.在我看来,你的例子总体上很好地利用了DI,甚至忽略了PCL的实际限制 - 你真的插入了不同的行为.
"平台启蒙"ala RX是另一种方法(这里所有这些方法的良好概述),其中PCL通过反射加载其他组件.
无论哪种情况,您都会增加项目数量.我认为有一个论点是尽可能多地将PCL放入PCL并将特定于平台的功能分离成单独的小块比从多个项目链接的大型共享库更清晰,其中共享和#if-条件代码之间的区别不太明显.
至于"你能说if(platform == WP7)"这个问题,你的PCL不能包含平台条件代码,尽管PCL可以定位所有包含所需功能的平台子集.
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |