本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity;由于快过年这段时间打算了解下vue.js,所以后面对webapi的分享文章可能会慢点更新,希望支持的朋友们多多谅解,毕竟只有不断充电学习,才能更好的适应it行业吧;本章内容希望大家喜欢,也希望各位多多扫码支持和推荐谢谢:
» Task并行任务抓取博客园首页信息
» IOC框架Ninject的使用
» IOC框架Unity的使用
下面一步一个脚印的来分享:
» Task并行任务抓取博客园首页信息
首先,咋们需要创建一个博客信息实体类 MoBlog ,实体类代码如下:
public class MoBlog { public MoBlog() { } /// <summary> /// 作者昵称 /// </summary> public string NickName { get; set; } /// <summary> /// 标题 /// </summary> public string Title { get; set; } /// <summary> ///该篇文字地址 /// </summary> public string Url { get; set; } /// <summary> /// 描述 /// </summary> public string Des { get; set; } /// <summary> /// 头像图片地址 /// </summary> public string HeadUrl { get; set; } /// <summary> /// 博客地址 /// </summary> public string BlogUrl { get; set; } /// <summary> /// 点赞次数 /// </summary> public int ZanNum { get; set; } /// <summary> /// 阅读次数 /// </summary> public int ReadNum { get; set; } /// <summary> /// 评论次数 /// </summary> public int CommiteNum { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreateTime { get; set; } }
然后,需要创建一个接口 IBlogsReposity ,并且定义一个如下代码的方法:
public interface IBlogsReposity { /// <summary> /// 获取博客信息 /// </summary> /// <param></param> /// <returns></returns> Task<IEnumerable<MoBlog>> GetBlogs(int nTask); }
注意这里定义的返回类型是Task<T>,主要作用是async异步返回博客信息,并且方便使用并行方式抓取不同页数的数据,因此这里传递了一个int类型的参数nTask(表示任务数量);好了咋们来一起看下具体实现接口的 BoKeYuan 类里面的代码:
public class BoKeYuan : IBlogsReposity { public async Task<IEnumerable<MoBlog>> GetBlogs(int nTask) { var blogs = new List<MoBlog>(); try { //开启nTask个任务,读取前nTask页信息 Task<IEnumerable<MoBlog>>[] tasks = new Task<IEnumerable<MoBlog>>[nTask]; for (int i = 1; i <= tasks.Length; i++) { tasks[i - 1] = await Task.Factory.StartNew<Task<IEnumerable<MoBlog>>>((page) => { return GetBlogsByPage(Convert.ToInt32(page)); }, i); } //30s等待 Task.WaitAll(tasks, TimeSpan.FromSeconds(30)); foreach (var item in tasks.Where(b => b.IsCompleted)) { blogs.AddRange(item.Result); } } catch (Exception ex) { } return blogs.OrderByDescending(b => b.CreateTime); } /// <summary> /// /// </summary> /// <param>页数</param> /// <returns></returns> async Task<IEnumerable<MoBlog>> GetBlogsByPage(int nPage) { var blogs = new List<MoBlog>(); try { var strBlogs = string.Empty; using (HttpClient client = new HttpClient()) { strBlogs = await client.GetStringAsync("http://www.cnblogs.com/sitehome/p/" + nPage); } if (string.IsNullOrWhiteSpace(strBlogs)) { return blogs; } var matches = Regex.Matches(strBlogs, "diggnum\"[^>]+>(?<hzan>\\d+)[^:]+(?<burl>http[^\"]+)[^>]+>(?<title>[^<]+)<\\/a>[^=]+=[^=]+=\"(?<hurl>(\\w|\\.|\\/)+)[^>]+>[^\\/]+\\/\\/(?<hphoto>[^\"]+)[^<]+<\\/a>(?<bdes>[^<]+)[^\"]+[^=]+=[^>]+>(?<hname>[^<]+)[^2]+(?<bcreatetime>[^<]+)[^\\(]+\\((?<bcomment>\\d+)[^\\(]+\\((?<bread>\\d+)"); if (matches.Count <= 0) { return blogs; } foreach (Match item in matches) { blogs.Add(new MoBlog { Title = item.Groups["title"].Value.Trim(), NickName = item.Groups["hname"].Value.Trim(), Des = item.Groups["bdes"].Value.Trim(), ZanNum = Convert.ToInt32(item.Groups["hzan"].Value.Trim()), ReadNum = Convert.ToInt32(item.Groups["bread"].Value.Trim()), CommiteNum = Convert.ToInt32(item.Groups["bcomment"].Value.Trim()), CreateTime = Convert.ToDateTime(item.Groups["bcreatetime"].Value.Trim()), HeadUrl = "http://" + item.Groups["hphoto"].Value.Trim(), BlogUrl = item.Groups["hurl"].Value.Trim(), Url = item.Groups["burl"].Value.Trim(), }); } } catch (Exception ex) { } return blogs; } }
代码分析:
1. Task<IEnumerable<MoBlog>>[] tasks = new Task<IEnumerable<MoBlog>>[nTask]作为并行任务的容器;
2. Task.Factory.StartNew创建对应的任务
3. Task.WaitAll(tasks, TimeSpan.FromSeconds(30));等待容器里面任务完成30秒后超时
4. 最后通过把item.Result任务结果添加到集合中,返回我们需要的数据