首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MvvmCross vNext:在PCL中使用System.IO.Compression

MvvmCross vNext:在PCL中使用System.IO.Compression
EN

Stack Overflow用户
提问于 2012-10-26 20:19:28
回答 1查看 861关注 0票数 2

我有一些需要来自System.IO.Compression名称空间的方法的模型代码。但是,当使用以VSMonoTouch和MonoAndroid为目标的PCL时,它就不存在了。我看到在MvvmCross解决方案中有一些东西是TypeForwarded的,但是在创建类似的项目时,我似乎找不到如何使用它。

我创建了一个MonoAndroid库项目,并添加了一个包含以下内容的Forward.cs类:

代码语言:javascript
复制
using System.Runtime.CompilerServices;

[assembly: TypeForwardedTo(typeof(System.IO.Compression.CompressionMode))]
[assembly: TypeForwardedTo(typeof(System.IO.Compression.DeflateStream))]
[assembly: TypeForwardedTo(typeof(System.IO.Compression.GZipStream))]

我已经将项目的名称空间设置为System.IO.Compression。我试图将它添加到我的模型代码中,作为对PCL项目的引用,其中包含ViewModels、服务和其他内容,当然它说它只能引用其他PCL项目和程序集。

我特别需要GZipStream,而且我似乎不知道如何将它添加到我的项目中,所以问题是我如何做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-26 20:56:51

PCL扩展路由

如何通过扩展PCL来做到这一点...我不是完全确定!PCL的人也许能帮上忙。

插件路由

我的方法是在接口中定义我想要的功能,并将代码包装在插件中。

例如,在Cheesebaron.Plugins.Gzip.dll中,您可以创建如下所示的接口:

代码语言:javascript
复制
public interface IGZipStreamFactory
{
     Stream Decompress(Stream binaryStream);
}

然后,这个接口将被插入到一个PCL库中,该库只包含这个接口和pluginmanager类。

然后,您的PCL Core项目可以引用此PCL插件库,并且您的ViewModel可以使用如下代码:

代码语言:javascript
复制
 Cheesebaron.Plugins.GZip.PluginLoader.Instance.EnsureLoaded();

紧接着是

代码语言:javascript
复制
 var service = this.GetService<IGZipStreamFactory>();
 var unzipped = service.Decompress(inputStream);

对于每个实际的平台实现,您需要准备一个特定于平台的库,实现GZip工厂接口,并提供一个简单的Plugin类实现。

例如,对于Droid,您可以创建Cheesebaron.Plugins.Gzip.Droid.dll

代码语言:javascript
复制
 public class MyDroidGZipStreamFactory : IGZipStreamFactory
 {
      // the implementation
 }

然后你会添加:

代码语言:javascript
复制
public class Plugin
    : IMvxPlugin
    , IMvxServiceProducer
{
    public void Load()
    {
        this.RegisterServiceInstance<IGZipStreamFactory>(new MyDroidGZipStreamFactory));
    }
}

终于..。为了把所有的东西放在一起,对于MonoDroid,你可以在你的UI项目中引用PCL和平台特定的实现--它们应该都可以工作!

请注意,在幕后有一个基于约定的小魔术--该框架基于Cheesebaron.Plugins.GzipCheesebaron.Plugins.Gzip.Droid.dll命名空间加载程序集插件

(对于WP7和其他平台,还有一个额外的步骤--有一个setup方法可以覆盖注册插件的方法)

注意:您可以在单个PlugIn中注册任意数量的服务,还可以执行额外的通用初始化/设置代码。这有助于减少一些项目维护开销:如果愿意,您可以将CheeseBaron IoC对象放在一个单独的CheeseBaron.Plugins.Utils项目中,然后在所有应用程序中共享这一个插件。

DownloadCache插件提供了一个很小的示例-它注册了所有的IMvxHttpFileDownloaderIMvxImageCacheIMvxLocalFileImageLoader

这样做的缺点是:最终链接的exe大小-您可能会向每个应用程序添加不需要的代码。

显然,这种插件方法有一点学习曲线……它确实增加了一些项目维护-但好消息是,这些插件可以在项目之间反复使用-并且可以在组织之间共享(至少,这是我的希望!)

有关创建插件的更多信息,请访问:

有关插件(并非所有平台都可用)的示例,请参见https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins

其他路线

如果你不想使用Plugins --例如,如果你很匆忙,或者你正在为一个你不想重用的模块写代码,那么还有其他的选择:

  • 你可以在你的共享核心PCL库中定义一个像IGZipStreamFactory这样的接口。然后,您可以在每个UI项目中提供此接口的特定于平台的实现,然后可以在视图模型/模型/服务层中使用普通的IoC/DI,以便在运行时定位正确的实现。

或者..。

  • 您只需转储共享的PCL核心库并创建单独的特定于平台的DLL,然后手动链接特定于平台的文件(我尝试从不这样做,但其他人喜欢)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13086823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档