MEF基础指南——MEF首次接触

代码示例托管地址:MEF_First_Touch

简介

简单理解MEF就是.NET中的一个IOC框架。主要是为了增加开发的应用的扩展性的。目的其实和其他IOC框架一样,就是解耦。

何为IOC

IOC,即控制反转。

个人理解:
它其实是在接口的基础上进一步解耦,像我们一开始写接口,就是为了可以使用多种实现嘛,但是呢,你在使用过程中,在一个地方还是只能用一个(多个地方就要一个一个new,顶多用个工厂封装下,但你还得在用的地方告诉工厂使用哪个实现);
而此时IOC就可以有用了,它只需要你在使用的地方进行接口声明即可(顶多再加一些特殊的标识——看你用哪个IOC框架了),至于实例化哪个实现IOC框架来帮你做。这里不是你告诉IOC用哪个实现,而是告诉IOC我要什么样的处理,然后IOC来找对应匹配的实现。其实在这里面工厂和IOC很相似,甚至说不清,简单理解就是,工厂的实例化的控制权其实还是在具体使用工厂的地方,而IOC中实例化的控制权在IOC容器中。

下面举个例子描述下:

  • 工厂 —— 我到水果摊买水果,我告诉老板买啥水果,老板给我找对应的水果。 模式是:A——(B——C,D,E),B进行统筹管理
  • IOC —— 我到淘宝买水果,我告诉淘宝要啥水果,淘宝找出与我要的相匹配的水果。模式是:A——B——(C,D,E),B就进行接口匹配,找对应关系

如何使用

既然MEF是一个IOC框架,使用自然会需要以下三点:

  • 接口定义,相关实现
  • 接口声明 —— 使用
  • 通知IOC容器要处理啥

接口定义及相关实现定义

在MEF中实现的定义用导出来处理,本示例中,我们首先定义一个接口,然后添加一个实现,内容如下:

interface IStudy
{
    void Study();
}

[Export(typeof(IStudy))]
class MEFStudy : IStudy
{
    public void Study()
    {
        Console.WriteLine("Study MEF");
    }
}

使用实现

在MEF中要使用对应的实现,我们使用导入功能,代码如下:

[Import]
IStudy Study { get; set; }

调用内部方法则是:

Study.Study();

告诉IOC容器要处理的内容

在MEF中,这个处理里涉及的内容有容器和目录,具体使用如下:

//利用目录添加到容器
var catalog = new AssemblyCatalog(typeof(Program).Assembly);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);

总结

至此,最简单的MEF使用就学会了。关于更多的导入导出等内容,后面将具体讨论。


奇葩史

关于使用到Xamarin.Android.Support相关dll无法生成问题解决

返回索引目录
参考内容: 个人yy,仅供参考

问题描述

由于在使用Xamarin.Android.Support相关的dll时,在生成项目期间需要到Google相应网站下载内容,故在国内常常会遇上生成不成功问题,其原因在于,无法下载相应的包。

解决方法:

  • 方案一:最简单也是最难的 —— 挂代理,对于会弄代理的,这个是最简单的,但对于搞不定代理、番羽(防叉叉)墙,这个就很麻烦了。

  • 方案二:离线处理 —— 关于离线处理,就得依赖网上友情人士提供压缩包了。

方案二离线处理之具体步骤

  • Xamarin.Android.Support相关的下载目录为C:\Users\你的用户名\AppData\Local\Xamarin,故离线处理只需将离线包下载放入zips目录下即可。
    • 如果你引用了Xamarin.Android.Support.v424.2.1版本,可以下载我下面给出的内容:【注意版本号,如果你使用的其他版本,则需要下载其他版本的】
  • 将上述下载到的压缩包直接放入C:\Users\你的用户名\AppData\Local\Xamarin\zips目录下。
    • 请注意:请勿修改压缩包名称 —— 依据个人每次生成名称一样得出的结论。
    • 如果你离线生成时,在C:\Users\你的用户名\AppData\Local\Xamarin\zips目录下生成的压缩包名称与我的不同,你可以用我给的替换下试试。—— 另望请告知。

另此离线处理非长久之法,毕竟现在Xamarin更新还是比较频繁的,此法更适合企业内网环境,所以建议能搞就搞个代理(更新及时)。

最后提供一个C盘瘦身内容

由于在Visual Studio生成Xamarin.Android项目时(在使用到Xamarin.Android.Support相关引用的情况下),会在C:\Users\你的用户名\AppData\Local\Xamarin目录下生成大量以Xamarin.Android.Support开头的文件夹;而此类文件夹是很大的,你可以将这一类文件夹删除 —— 但请注意不要删除zips内的文件,不然又得重新下了。

此法有一缺陷:删除后再次生成时会比较慢,所以建议在C盘比较紧张的情况下,去删除文件;或者是你更新版本了,可以将内部旧版文件删掉。


译:奇葩史

关于使用HttpClient请求返回中文乱码问题

本文内容为.NET平台中,使用HttpClient对某些中文网页进行请求时,遇上乱码问题解决方案整理。
个人遇到的网页即使是使用Postman也是乱码。

问题缘由

说到底就是charset的问题。在国内许多网站使用gb2312编码,导致直接使用Http请求默认转化乱码。一般utf-8的网站编码,不会遇上这个问题。

个人最终解决方案

先上代码:

此处代码中未使用异步功能,其中涉及的Async方法,在正式开发中,都可以利用await/async进行异步处理

HttpClient client = new HttpClient();
var responsestream = client.GetStreamAsync("http://www.shisujie.com").Result;
System.IO.StreamReader reader = new System.IO.StreamReader(responsestream, Encoding.GetEncoding("gb2312"));
string result = reader.ReadToEnd();

通过使用流的方式直接修改编码解析内容。

补充

上述方法我在第一天晚上认为可以,那天晚上确实可以了,然而第二天,又乱码了,一直不知道原因,后来在网上看到了关于gzip的,也就是说需要利用gzip解压。

最终代码如下:

var responsestream = client.GetStreamAsync("http://www.shisujie.com").Result;
GZipStream gz = new GZipStream(responsestream, CompressionMode.Decompress);
System.IO.StreamReader reader = new System.IO.StreamReader(gz, Encoding.GetEncoding("GB2312"));
string r = reader.ReadToEnd();

即使用GZipStream类型的数据流。

网络中提到的一些方案

方案一:修改响应头的charset值

var rep = client.GetAsync("http://www.shisujie.com").Result;
rep.Content.Headers.ContentType.CharSet = "gb2312"; 

此法还是较为靠谱的,但是针对我遇到的无效

方案二:将网页下载为本地文件

System.Net.WebClient client1 = new System.Net.WebClient();
client1.DownloadFile("http://www.shisujie.com/***", "D:\\test.html");

此法是个人网上资料一直解决不了问题后做的尝试,但一般网页正确下载应该是Windows(换行)格式+UTF-8编码;
而本人尝试的下载的文件是Unix(换行)格式+ANSI编码 —— 关键是http请求的编码应该是GB2312,所以最后很扯的没有成功。

方案三:使用字节流转化

var result = client.GetByteArrayAsync("http://www.shisujie.com").Result;
var r = Encoding.GetEncoding("GBK").GetString(result);

个人处理经历

仅供参考,以便于了解些问题解决思路

  • 首先确定是否是请求头问题,为请求头添加较为完整的信息
    • 包括Accept,AcceptLanguage等等,还有就是UserAgent,有些网站会对UserAgent判断。
  • 其次判断charset,也就是上面的方案一。
  • 后面还不行,还有判断是不是html编码,使用System.Net.WebUtility.HtmlDecode()转转格式看下。
  • 最后,就是抓包分析了 —— 不过好像在此次作用不大,我本以为是我发的http包有问题,就对比了下,尽管发的包不完全一样,但收到的结果完全一样啊 —— 即http请求正确,那就可以确定完全就是本地处理问题,就可以将重点放在本地数据流处理了。

奇葩史

百度网盘

百度网盘logo

百度网盘

隶属于百度公司,国内现在网盘挂的差不多了,也就百度依旧坚挺,具体到啥时候就不清楚了。

槽点

  • 同步盘相继停止更新:windows版2015-2、mac版 2015-7
  • 据说有限制用户下载-限速
  • 新版移动端加入了新闻功能,显得特臃肿
  • 小视频(及其他特殊内容)不能存,即使是私人不共享,传了就会被替换掉
  • 个人不反对收费,但信誉问题。。。。
  • 开发相关:相比国外大牌的云存储厂商,真的缺少完整api;相对太封闭。
    • 据说现在的psc各种限制

推荐

  • 相对来说,针对国内用户还是表示推荐使用的

基本介绍

相关链接

基本信息

  • 初始容量:已经不记得了,反正现在我总共有2159G
    • 免费扩展容量:2T
    • 收费扩展容量:5T
  • 地域:中国
    • 支持语言:简体中文
  • 外链分享:支持
  • 文件历史版本:支持
  • 成立/推出时间:2012-03-23

开发者相关

大事件

  • 2016-10 改名大法:正式改名为百度网盘,原名百度云

带你看看网盘的世界

本文内容后续会调整,初期为整理自己以前收藏的网盘内容,进行初步整理。有一些完全没打开的网站直接就删掉了。
由于国内个人云存储市场在晃荡,所以自己把以前收藏的网站准备拿出来整理下,好及时调整。

集成客户端——本地管理

  • AsLocal网盘本地管理专家 http://www.aslocal.com/ —— 本人需挂代理访问官网,可能是移动的墙

网盘资源搜索

网盘

国内

国外

已经挂掉的


掘:奇葩史