<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        webapi中如何使用依賴注入

        來源:懂視網 責編:小采 時間:2020-11-27 22:36:02
        文檔

        webapi中如何使用依賴注入

        webapi中如何使用依賴注入:本篇將要和大家分享的是webapi中如何使用依賴注入,依賴注入這個東西在接口中常用,實際工作中也用的比較頻繁,因此這里分享兩種在api中依賴注入的方式Ninject和Unity;由于快過年這段時間打算了解下vue.js,所以后面對webapi的分享文章可能會慢點更新,希望
        推薦度:
        導讀webapi中如何使用依賴注入:本篇將要和大家分享的是webapi中如何使用依賴注入,依賴注入這個東西在接口中常用,實際工作中也用的比較頻繁,因此這里分享兩種在api中依賴注入的方式Ninject和Unity;由于快過年這段時間打算了解下vue.js,所以后面對webapi的分享文章可能會慢點更新,希望

        本篇將要和大家分享的是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 name="nTask"></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 name="nPage">頁數</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>http://(\\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任務結果添加到集合中,返回我們需要的數據

        這里解析博客內容信息用的正則表達式,這種方式在抓取一定內容上很方便;群里面有些朋友對正則有點反感,剛接觸的時候覺得挺不好寫的,所以一般都采用更復雜或者其他的解析方式來獲取想要的內容,這里提出來主要是和這些朋友分享下正則獲取數據是多么方便,很有必要學習下并且掌握常規的用法,這也是一種苦盡甘來的體驗吧哈哈;

        好了咋們創建一個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):http://www.lovexins.com:1001/api/values?task=6;咋們來想象一下,如果這個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());
         }
         }

        這里能夠看到 IKernel kernel = new StandardKernel(); 這代碼,她們引用都來源于我們安裝的Ninject包,通過調用初始化Initing()后,我們需要在Binding()方法中手動綁定我們對應需要依賴注入的實例,Ninject綁定方式有很多種這里我用的格式是: kernel.Bind<接口>().To<實現類>(); 如此簡單就實現了依賴注入,每次我們需要添加不同的依賴項的時候只需要在這個Binding()中使用Bind<接口>.To<接口實現類>()即可綁定成功;好了為了驗證咋們測試成功性,我們需要在apiController中使用這個依賴關系,這里我使用構造函數依賴注入的方式:

        private readonly IBlogsReposity _reposity
         public ValuesController(IBlogsReposity reposity)
         {
         _reposity = reposity;
         }
         // GET api/values 
         public async Task<IEnumerable<MoBlog>> Get(int task = 6)
         {
         task = task <= 0 ? 6 : task;
         task = task > 50 ? 50 : task;
         return await _reposity.GetBlogs(task);
         }
        

        代碼如上所示,我們運行下程序看下效果:

        這個時候提示了個錯誤“沒有默認構造函數”;我們剛才使用的構造函數是帶有參數的,而自定義繼承的 ApiController 中有一個無參數的構造函數,根據錯誤提示內容完全無解;不用擔心,解決這個問題只需要在 WebApiConfig.cs 中Register方法中增加如下代碼:

         //Ninject ioc
         config.DependencyResolver = NinjectResolverContainer.Current;

        這句代碼意思就是讓程序執行上面咋們創建的容器 NinjectResolverContainer ,這樣才能執行到我能剛才寫的ioc程序,才能實現依賴注入;值得注意的是 config.DependencyResolver 是webapi自帶的提供的,mvc項目也有同樣提供了 DependencyResolver  給我們使用方便做依賴解析;好了這次我們在運行項目可以得到如圖效果:

        » IOC框架Unity的使用

        首先,安裝Unity和Unity.WebAPI的nuget包,我這里的版本是:

        我們再同樣創建個自定義容器類 UnityResolverContainer ,實現接口 IDependencyResolver (這里和上面Ninject一樣);然后這里貼上具體使用Unity實現的方法:

        public class UnityResolverContainer : IDependencyResolver
         {
         private IUnityContainer _container;
         public UnityResolverContainer(IUnityContainer container)
         {
         this._container = container;
         }
         public IDependencyScope BeginScope()
         {
         var scopeContainer = this._container.CreateChildContainer();
         return new UnityResolverContainer(scopeContainer);
         }
         /// <summary>
         /// 獲取對應類型的實例,注意try...catch...不能夠少
         /// </summary>
         /// <param name="serviceType"></param>
         /// <returns></returns>
         public object GetService(Type serviceType)
         {
         try
         {
         //if (!this._container.IsRegistered(serviceType)) { return null; }
         return this._container.Resolve(serviceType);
         }
         catch
         {
         return null;
         }
         }
         public IEnumerable<object> GetServices(Type serviceType)
         {
         try
         {
         return this._container.ResolveAll(serviceType);
         }
         catch
         {
         return new List<object>();
         }
         }
         public void Dispose()
         {
         if (_container != null)
         {
         this._container.Dispose();
         this._container = null;
         }
         }
         }
        

         這里和使用Ninject的方式很類似,需要注意的是我們在安裝Unity包的時候會自動在 WebApiConfig.cs 增加如下代碼:

         //Unity ioc
        UnityConfig.RegisterComponents();

        然后同時在 App_Start 文件夾中增加 UnityConfig.cs 文件,我們打開此文件能看到一些自動生成的代碼,這里我們就可以注冊綁定我們的依賴,代碼如:

        public static class UnityConfig
         {
         public static void RegisterComponents()
         {
         var container = new UnityContainer();
         container.RegisterType<IBlogsReposity, BoKeYuan>();
         // var lifeTimeOption = new ContainerControlledLifetimeManager();
         //container.RegisterInstance<IBlogsReposity>(new BoKeYuan(), lifeTimeOption);
         GlobalConfiguration.Configuration.DependencyResolver = new UnityResolverContainer(container);
         }
         }

        這里展示了兩種注冊依賴的方式: container.RegisterType<IBlogsReposity, BoKeYuan>(); 和 container.RegisterInstance<IBlogsReposity>(new BoKeYuan(), lifeTimeOption); ,當然還有其他的擴展方法這里就不舉例了;最后一句代碼: GlobalConfiguration.Configuration.DependencyResolver = new UnityResolverContainer(container); 和我們之前Ninject代碼一樣,只是換了一個地方和實例化寫法方式而已,各位可以仔細對比下;其實 UnityConfig.cs 里面的內容都可以移到 WebApiConfig.cs 中去,unity自動分開應該是考慮到代碼內容分塊來管理吧,好了同樣我們使用自定義的 ValuesController 的構造函數來添加依賴:

        public class ValuesController : ApiController
         {
         private readonly IBlogsReposity _reposity;
         public ValuesController(IBlogsReposity reposity)
         {
         _reposity = reposity;
         }
         // GET api/values 
         public async Task<IEnumerable<MoBlog>> Get(int task = 6)
         {
         task = task <= 0 ? 6 : task;
         task = task > 50 ? 50 : task;
         return await _reposity.GetBlogs(task);
         }
        }
        

        從代碼上來看,這里面Ninject和Unity的注入方式沒有差異,這樣能就讓我們開發程序的時候兩種注入方式可以隨便切換了,最后來我這里提供一個使用這個webapi獲取數據綁定到頁面上的效果:

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        webapi中如何使用依賴注入

        webapi中如何使用依賴注入:本篇將要和大家分享的是webapi中如何使用依賴注入,依賴注入這個東西在接口中常用,實際工作中也用的比較頻繁,因此這里分享兩種在api中依賴注入的方式Ninject和Unity;由于快過年這段時間打算了解下vue.js,所以后面對webapi的分享文章可能會慢點更新,希望
        推薦度:
        標簽: 使用 API 依賴注入
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产中文在线视频| 亚洲五月综合缴情在线观看| 国产91色综合久久免费分享| 91麻豆国产免费观看| 在线播放高清国语自产拍免费| 日本免费人成视频播放| 亚洲色爱图小说专区| 久久免费99精品国产自在现线| 久久国产色AV免费看| 亚洲精品午夜视频| 亚洲6080yy久久无码产自国产| a级片在线免费看| 成年性生交大片免费看| 亚洲gv猛男gv无码男同短文| 亚洲高清国产拍精品熟女| 99免费在线视频| 亚洲尹人九九大色香蕉网站| 羞羞视频免费网站入口| 久久国产色AV免费观看| 亚洲日本久久一区二区va| fc2成年免费共享视频18| 妞干网免费观看视频| 看亚洲a级一级毛片| 桃子视频在线观看高清免费完整| 亚洲国产综合久久天堂| 亚洲激情电影在线| 美女被免费喷白浆视频| 日本亚洲欧美色视频在线播放| 亚洲第一视频在线观看免费| 久久久国产亚洲精品| 美丽姑娘免费观看在线观看中文版| 又爽又黄无遮挡高清免费视频| 亚洲综合激情另类小说区| 黄色片在线免费观看| 免费中文字幕视频| 四虎免费久久影院| 亚洲国产AV一区二区三区四区| 久久久久国产亚洲AV麻豆| 老司机午夜性生免费福利| 亚洲AV午夜成人片| 日本19禁啪啪无遮挡免费动图|