这里解析博客内容信息用的正则表达式,这种方式在抓取一定内容上很方便;群里面有些朋友对正则有点反感,刚接触的时候觉得挺不好写的,所以一般都采用更复杂或者其他的解析方式来获取想要的内容,这里提出来主要是和这些朋友分享下正则获取数据是多么方便,很有必要学习下并且掌握常规的用法,这也是一种苦尽甘来的体验吧哈哈;
好了咋们创建一个webapi项目取名为 Stage.Api ,使用她自动生成的 ValuesController 文件里面的Get方法接口来调用咋们上面实现的博客抓取方法,代码如下:
// GET api/values public async Task<IEnumerable<MoBlog>> Get(int task = 6) { task = task <= 0 ? 6 : task; task = task > 50 ? 50 : task; IBlogsReposity _reposity = new BoKeYuan(); return await _reposity.GetBlogs(task); }
这里使用 IBlogsReposity _reposity = new BoKeYuan(); 来创建和调用具体的实现类,这里贴出一个线上抓取博客首页信息的地址(不要告诉dudu):;咋们来想象一下,如果这个Get方法中还需要调用其他实现了接口 IBlogsReposity 的博客抓取类,那咋们又需要手动new一次来创建对应的对象;倘若除了在 ValuesController.cs 文件中调用了博客数据抓取,其他文件还需要这抓取数据的业务,那么又会不停的new,可能有朋友就会说那弄一个工厂模式怎么样,不错这是可行的一种方式,不过这里还有其他方法能处理这种问题,比如:ioc依赖注入;因此就有了下面的分享内容。
» IOC框架Ninject的使用
首先,我们要使用ninject需要使用nuget下载安装包,这里要注意的是Ninject版本比较多,需要选择合适自己webapi的版本,我这里选择的是:
看起来很老了哈哈,不过咋们能用就行,安装起来可能需要点时间,毕竟比较大么也有可能是网络的问题吧;安装完后咋们创建一个自定义类 NinjectResolverScope 并实现接口 IDependencyScope , IDependencyScope 对应的类库是 System.Web.Http.dll (注:由于webapi2项目自动生成时候可能勾选了mvc,mvc框架里面也包含了一个IDependencyScope,所以大家需要注意区分下),好了咋们来直接看下 NinjectResolverScope 实现代码:
/// <summary> /// 解析 /// </summary> public class NinjectResolverScope : IDependencyScope { private IResolutionRoot root; public NinjectResolverScope() { } public NinjectResolverScope(IResolutionRoot root) { this.root = root; } public object GetService(Type serviceType) { try { return root.TryGet(serviceType); } catch (Exception ex) { return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return this.root.GetAll(serviceType); } catch (Exception ex) { return new List<object>(); } } public void Dispose() { var disposable = this.root as IDisposable; if (disposable != null) disposable.Dispose(); this.root = null; } }
这里要注意的是GetService和GetServices方法必须使用 try...catch() 包住,经过多方调试和测试,这里面会执行除手动bind绑定外的依赖,还会执行几个其他非手动绑定的实例对象,这里使用try避免抛异常影响到程序(其实咋们可以在这里用代码过滤掉非手动绑定的几个实例);这里也简单说下这个 NinjectResolverScope 中方法执行的先后顺序:GetService=》GetServices=》Dispose,GetService主要用来获取依赖注入对象的实例;好了到这里咋们还需要一个自定义容器类 NinjectResolverContainer ,该类继承自上面的 NinjectResolverScope 和实现 IDependencyResolver 接口(其实细心的朋友能发现这个 IDependencyResolver 同样也继承了 IDependencyScope ),具体代码如下:
public class NinjectResolverContainer : NinjectResolverScope, IDependencyResolver { private IKernel kernel; public static NinjectResolverContainer Current { get { var container = new NinjectResolverContainer(); //初始化 container.Initing(); //绑定 container.Binding(); return container; } } /// <summary> /// 初始化kernel /// </summary> void Initing() { kernel = new StandardKernel(); } /// <summary> /// 绑定 /// </summary> void Binding() { kernel.Bind<IBlogsReposity>().To<BoKeYuan>(); } /// <summary> /// 开始执行 /// </summary> /// <returns></returns> public IDependencyScope BeginScope() { return new NinjectResolverScope(this.kernel.BeginBlock()); } }