手机版

如何在webapi中使用依赖注入

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

本文将与大家分享如何在webapi中使用依赖注入,这是接口中常用的,也是实际工作中经常用到的,所以这里我们分享两种api中依赖注入的方式:Ninject和Unity;由于我计划在新年期间了解vue.js,所以webapi上的分享文章可能更新比较慢。希望支持的朋友多理解。毕竟,只有不断充电和学习,才能更好地适应IT行业;希望大家喜欢这一章的内容,也希望大家对扫码有更多的支持和推荐。谢谢你:

任务并行任务捕获博主公园的主页信息

国际奥委会框架的使用

统一在国际奥委会框架中的应用

让我们一步步分享:

任务并行任务捕获博主公园的主页信息

首先,我们需要创建一个博客信息实体类MoBlog,实体类代码如下:

public class mob log { public mob log(){ }///summary///作者昵称////summary public string昵称{ get设置;}///summary///title////summary public string title { get;设置;} ///summary ///此文本地址////summary公共字符串Url { get设置;}///summary///description////summary公共字符串Des { get设置;} ///summary ///头像图片地址////summary公共字符串头URL { get设置;}///summary///blog address////summary public string blog { get;设置;}///summary////赞美次数////summary public int ZanNum { get;设置;}///summary////reading times////summary public int readnum { get;设置;}///summary////comment times////summary public int commit enum { get;设置;}///summary////创建时间////summary public datetime create time { get;设置;}}然后,您需要创建一个接口IBlogsReposity,并使用以下代码定义一个方法:

公共接口iblogs positiony {///summary///get blog information/////summary///param name=' ntask '/param///returns/returns taskienumerableoblog getblogs(int ntask);}注意这里定义的返回类型是TaskT,主要用于async异步返回博客信息,便于并行抓取不同页面的数据,所以这里传递了一个int类型参数nTask(表示任务数);好了,让我们看看实现接口的BoKeYuan类中的代码:

公共类BoKeYuan : iblogs位置{ public async taskienumerableblog GetBlogs(int nTask){ var blogs=new ListMoBlog();尝试{ //开启nTask个任务,读取前nTask页信息taskienumerableblog[]tasks=new taskienumerableblog[NTask];for(int I=1;i=任务。长度;I){ 0任务[i - 1]=等待任务工厂。startnewtaskienumerableblog((page)={ return GetBlogsByPage(Convert .ToInt32(第页));},我);} //30s等待任务。等待所有(任务,时间跨度。从秒(30));foreach(任务中的定义变量项目。其中(b=b.IsCompleted)) {博客.添加范围(项目。结果);} } catch (Exception ex) { }返回博客order by Densing(b=b .创建时间);}///summary/////summary////param name=' nPage '页数/param///returns/returns async taskienumerableblog GetBlogsByPage(int nPage){ var blogs=new ListMoBlog();请尝试{ var strBlogs=string .空的;使用(Http客户端客户端=新的Http客户端()){ STrblogs=等待客户端.GetStringAsync(' http://www .cn博客。com/site home/p/' nPage);}如果(字符串isnullorhitespace(STrblogs)){ 0返回博客;} var matches=Regex .匹配(strBlogs,'diggnum\'[^](?)[^:burlhttp[^\'] )[^](?title[^] )\\/a[^=]=[^=]=\ '(?hurlhttp://(\\w|\\ .|\\/) )[^] [^\\/] \\/\\/(?hphoto[^\'] )[^] \\/a(?bdes[^] )[^\'] [^=]=[^](?hname[^] )[^2](?bcreatetime[^] )[^\\(] \\(?)[^\\(] \\(?面包\ \ d)');如果(匹配计数=0){ 0返回博客;} foreach(匹配项中的匹配项){博客.添加(新的移动日志{标题=项目.分组['title'].Value.Trim(),昵称=项目.分组['hname'].Value.Trim(),Des=item .组['bdes'].Value.Trim(),ZanNum=Convert .ToInt32(项目。组['hzan'].Value.Trim()),ReadNum=Convert .ToInt32(项目第[面包]组。价值。trim()),CommiteNum=Convert .ToInt32(项目。组['bcomment'].Value.Trim()),CreateTime=Convert .今日时间(项目。分组['bcreatetime'].Value.Trim()),HeadUrl='http://'项团体['惠普照片']。价值。trim(),BlogUrl=item .团体['投掷']。价值。trim(),Url=item .组[' burl ']。价值。trim(),});} } catch (Exception ex) { }返回博客;} }代码分析:

1 . taskienumerableblog[]tasks=new taskienumerableblog[nTask]作为并行任务的容器;

2.任务。工厂。新开始创建对应的任务

3.任务。等待所有(任务,时间跨度。从秒(30));等待容器里面任务完成30秒后超时

4.最后通过把项目。结果任务结果添加到集合中,返回我们需要的数据

这里解析博客内容信息用的正则表达式,这种方式在抓取一定内容上很方便;群里面有些朋友对正则有点反感,刚接触的时候觉得挺不好写的,所以一般都采用更复杂或者其他的解析方式来获取想要的内容,这里提出来主要是和这些朋友分享下正则获取数据是多么方便,很有必要学习下并且掌握常规的用法,这也是一种苦尽甘来的体验吧哈哈;

好了咋们创建一个webapi项目取名为舞台Api,使用她自动生成的值控制器文件里面的得到方法接口来调用咋们上面实现的博客抓取方法,代码如下:

//GET API/values public async taskienumerableoblog GET(int task=6){ task=task=0?6 :任务;任务=任务50?50 :任务;iblogsrepposity _ respity=new BoKeYuan();返回等待_重新定位。GetBlogs(任务);}在这里使用iblogsrpositiy _ repository=new bokeyuan();创建并调用具体的实现类,发布地址(不要告诉嘟嘟)在线抓取博客主页信息:http://www . lovexists.com :1001/API/values?任务=6;想象一下,如果这个Get方法需要调用实现接口IBlogsReposity的其他博客捕获类,那么您需要手动新建一次来创建相应的对象;如果在ValuesController.cs文件中调用blog数据捕获,其他文件需要这个数据捕获服务,那么它会保持新的,有些朋友可能会说如何获得工厂模式。是的,这是一个可行的办法,但是还有其他的办法来处理这个问题,比如:ioc靠打针;因此,有以下分享内容。

国际奥委会框架的使用

首先,我们需要使用nuget下载安装包来使用Ninject。在这里,我们要注意一个事实,ninject有很多版本,我们需要选择适合我们的webapi版本。我在这里选择的是:

它看起来很旧,哈哈,但是如果你能使用它,安装它可能需要一些时间。毕竟比较大的话可能是网络问题;安装后,我们将创建一个自定义类NinjectResolverScope,并实现接口IDependencyScope。IDependencyScope对应的类库是System.Web.Http.dll(注:webapi2项目自动生成时可能会勾选mvc。mvc框架还包含一个IDependencyScope,所以大家需要注意区分一下。好了,让我们直接看一下NinjectResolverScope实现代码:

///summary////解析////summary公共类ninejectresolverscope : idependencyscope { private iresolutionroot;public NinjectResolverScope(){ } public NinjectResolverScope(IResolutionRoot root){ this . root=root;}公共对象GetServiCe(Type ServiCeType){ try { return root。TryGet(service type);} catch (Exception ex) {返回null} } public IEnumerableobject GetServices(Type service Type){ try { return this . root . getall(service Type);} catch (Exception ex) {返回新的Listobject();} } public void Dispose(){ var Dispose=this . root as IDisposable;如果(一次性的!=null)一次性的。dispose();this.root=null}}这里需要注意的是,GetService和GetServices方法必须用try包装.catch()。在以多种方式进行调试和测试之后,除了手动绑定之外,还会有依赖关系,以及其他几个没有手动绑定的实例对象。这里使用Try是为了避免抛出异常影响程序(事实上,我们可以过滤掉这里没有用代码手工绑定的几个实例);这里简单说一下这个NinjectResolverScope中方法的执行顺序:GetService=" getServices=" dispose,GetService主要用于获取依赖注入对象的实例;好了,这里我们需要一个自定义的容器类NinjectResolverContainer,它继承了上面的NinjectResolverScope,实现了idedependencyresolver接口(其实细心的朋友可以发现,这个idedependencyresolver也继承了IDependencyScope)。具体代码如下:

公共类ninejectresolverecontainer : ninejectresolverescope,idedependencyresolver { private Iker nel内核;公共静态ninejectresolvercontainer Current { get { var容器=new ninejectresolvercontainer();//初始化容器。initing();//绑定容器。binding();返回容器;} }///summary////initialize kernel////summary void initializing(){ kernel=new standard kernel();}///summary///binding////summary void binding(){ kernel。bindiblogsreposity()。tobokeyuan();}///summary///start execution////summary///returns/returns public独立性作用域begin scope(){ return new ninejectresolverscope(this。kernel . begin block());}}这里我们可以看到ikernkerkernel=newstandard kernel();这段代码和它们的引用都来自我们安装的Ninject包。通过调用初始化initialize()之后,我们需要在Binding()方法中手动绑定需要依赖注入的对应实例。有许多方法可以绑定Ninject。我这里使用的格式是:内核。绑定接口()。实现类();依赖注入是如此简单,以至于每次我们需要添加不同的依赖时,我们只需要使用绑定接口。在此绑定()中接口实现类()以成功绑定;好的,为了验证测试的成功,我们需要在apiController中使用这个依赖项。这里我使用构造函数依赖注入方法:

private readonly iblogsrpositiy _ reposity public values controller(iblogsrpositiy reposity){ _ reposity=reposity;}//GET API/values public async taskienumerableoblog GET(int task=6){ task=task=0?6 :任务;任务=任务50?50 :任务;返回等待_重新定位。GetBlogs(任务);}代码如上所示,让我们运行程序看看效果:

此时,提示错误“无默认构造函数”;我们刚才使用的构造函数是有参数的,但是自定义继承的ApiController中有一个无参数的构造函数,根据错误提示没有解;别担心,要解决这个问题,您只需要在WebApiConfig.cs中的Register方法中添加以下代码:

//n对象ioc配置。dependency resolver=ninejectresolvercontainer。当前;这段代码的意义是让程序执行上面创建的容器NinjectResolverContainer,从而执行我刚刚编写的ioc程序,实现依赖注入;值得注意的是。dependencyRelSolver是由webapi提供的,mvc项目也提供了dependencyRelSolver供我们用于依赖关系解析。好了,这次我们正在运行这个项目,我们可以得到如图所示的效果:

统一在国际奥委会框架中的应用

首先,安装Unity和Unity的nuget包。我这里的版本是:

我们还创建了一个定制的容器类UnityResolverContainer来实现接口IDependencyResolver(这里与上面的Ninject相同);然后在这里粘贴Unity实现的方法:

公共类UnityResolverContainer : idedependencyresolver { private IutyContainer _ container;public UnityResolverContainer(IutyContainer容器){这个._ container=container } public idedependency scope begin scope(){ var scope container=this ._容器CreateChildContainer();返回新的UnityResolverContainer(作用域容器);} ///摘要///获取对应类型的实例,注意尝试.捕捉.不能够少////summary////param name=' service Type '/param///returns/returns public object GetService(Type service Type){ try {//if(!这个。_容器IsRegistered(ServiCeType)){ 0返回null}退回这个。_容器。解析(服务类型);} catch { return null } } public IEnumerableObject GetSerVices(Type service Type){ 0尝试{返回此。_容器全部解析(服务类型);} catch { return new Listobject();} } public void Dispose(){ if(_ container!=null) {这个._容器dispose();这个_ container=null} } }这里和使用n项目的方式很类似,需要注意的是我们在安装一致包的时候会自动在WebApiConfig.cs增加如下代码:

//Unity iocUnityConfig .RegisterComponents();然后同时在应用程序_开始文件夹中增加UnityConfig.cs文件,我们打开此文件能看到一些自动生成的代码,这里我们就可以注册绑定我们的依赖,代码如:

公共静态类unity config { public static void RegisterComponents(){ var container=new unity container();集装箱RegisterTypeIBlogsReposity,BoKeYuan();//var life option=new containercontroledlimitemanager();//容器registerinstance iblogspositiony(新的BoKeYuan(),终身选项);全局配置配置。dependency resolver=new UnityResolvercontainer(容器);} }这里展示了两种注册依赖的方式:容器RegisterTypeIBlogsReposity,BoKeYuan();和集装箱registerinstance iblogspositiony(新的BoKeYuan(),终身选项);当然还有其他的扩展方法这里就不举例了;最后一句代码:全局配置配置。dependency resolver=new UnityResolvercontainer(容器);和我们之前n项目代码一样,只是换了一个地方和实例化写法方式而已,各位可以仔细对比下;其实UnityConfig.cs里面的内容都可以移到WebApiConfig.cs中去团结自动分开应该是考虑到代码内容分块来管理吧,好了同样我们使用自定义的值控制器的构造函数来添加依赖:

公共类值控制器: APi控制器{ private readonly iblogsrpositiy _ resubty;public values controller(IBlogsReposity reposity){ _ reposity=reposity;}//GET API/values public async taskienumerableblog GET(int task=6){ task=task=0?6 :任务;任务=任务50?50 :任务;返回等待_重新定位GetBlogs(任务);}}从代码上来看,这里面n项目和一致的注入方式没有差异,这样能就让我们开发程序的时候两种注入方式可以随便切换了,最后来我这里提供一个使用这个webapi获取数据绑定到页面上的效果:

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

版权声明:如何在webapi中使用依赖注入是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。