我有一些需要来自System.IO.Compression名称空间的方法的模型代码。但是,当使用以VSMonoTouch和MonoAndroid为目标的PCL时,它就不存在了。我看到在MvvmCross解决方案中有一些东西是TypeForwarded的,但是在创建类似的项目时,我似乎找不到如何使用它。
我创建了一个MonoAndroid库项目,并添加了一个包含以下内容的Forward.cs类:
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,而且我似乎不知道如何将它添加到我的项目中,所以问题是我如何做到这一点?
发布于 2012-10-26 20:56:51
PCL扩展路由
如何通过扩展PCL来做到这一点...我不是完全确定!PCL的人也许能帮上忙。
插件路由
我的方法是在接口中定义我想要的功能,并将代码包装在插件中。
例如,在Cheesebaron.Plugins.Gzip.dll中,您可以创建如下所示的接口:
public interface IGZipStreamFactory
{
Stream Decompress(Stream binaryStream);
}然后,这个接口将被插入到一个PCL库中,该库只包含这个接口和pluginmanager类。
然后,您的PCL Core项目可以引用此PCL插件库,并且您的ViewModel可以使用如下代码:
Cheesebaron.Plugins.GZip.PluginLoader.Instance.EnsureLoaded();紧接着是
var service = this.GetService<IGZipStreamFactory>();
var unzipped = service.Decompress(inputStream);对于每个实际的平台实现,您需要准备一个特定于平台的库,实现GZip工厂接口,并提供一个简单的Plugin类实现。
例如,对于Droid,您可以创建Cheesebaron.Plugins.Gzip.Droid.dll
public class MyDroidGZipStreamFactory : IGZipStreamFactory
{
// the implementation
}然后你会添加:
public class Plugin
: IMvxPlugin
, IMvxServiceProducer
{
public void Load()
{
this.RegisterServiceInstance<IGZipStreamFactory>(new MyDroidGZipStreamFactory));
}
}终于..。为了把所有的东西放在一起,对于MonoDroid,你可以在你的UI项目中引用PCL和平台特定的实现--它们应该都可以工作!
请注意,在幕后有一个基于约定的小魔术--该框架基于Cheesebaron.Plugins.Gzip的Cheesebaron.Plugins.Gzip.Droid.dll命名空间加载程序集插件
(对于WP7和其他平台,还有一个额外的步骤--有一个setup方法可以覆盖注册插件的方法)
注意:您可以在单个PlugIn中注册任意数量的服务,还可以执行额外的通用初始化/设置代码。这有助于减少一些项目维护开销:如果愿意,您可以将CheeseBaron IoC对象放在一个单独的CheeseBaron.Plugins.Utils项目中,然后在所有应用程序中共享这一个插件。
DownloadCache插件提供了一个很小的示例-它注册了所有的IMvxHttpFileDownloader、IMvxImageCache和IMvxLocalFileImageLoader。
这样做的缺点是:最终链接的exe大小-您可能会向每个应用程序添加不需要的代码。
显然,这种插件方法有一点学习曲线……它确实增加了一些项目维护-但好消息是,这些插件可以在项目之间反复使用-并且可以在组织之间共享(至少,这是我的希望!)
有关创建插件的更多信息,请访问:
有关插件(并非所有平台都可用)的示例,请参见https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins
其他路线
如果你不想使用Plugins --例如,如果你很匆忙,或者你正在为一个你不想重用的模块写代码,那么还有其他的选择:
或者..。
https://stackoverflow.com/questions/13086823
复制相似问题