使用Autofac动态注入启动Api服务
Autofac
Autofac(https://autofac.org/)是一款.NET的IOC组件,它可以和Owin, Web Api, ASP.NET MVC, .NET Core完美结合,帮助开发人员轻松解决程序中的依赖注入问题。
动态注入启动Web Api
所谓的动态注入启动Web Api需求, 就是在Web服务器启动时, 可以动态选择启动的Web Api 服务。
以前使用IIS + Web Api的时候,我们需要手动在IIS中部署所有的Web Api服务,并手动启动需要使用Web Api服务。
在微软推出Owin之后,Owin Self Host + Web Api使开发人员可以脱离IIS服务器,使用命令行的方式启动并寄宿一个Web服务。Web服务启动时,我们可以使用一些IOC容器,对Web Api进行动态注入启动。
具体案例
当前有一个项目(源码:https://github.com/lamondlu/DynamicInjection)中有2个Web Api服务ServiceA, ServiceB, 项目结构如下
- Service A和Service B的controller存放在不同的项目中。
- DynamicInjection是一个控制台项目,负责启动Web服务。
- 当Build Service A和Service B项目时,会自动将生成的dll复制到DynamicInjection项目中的Services目录中。
- 现在需要在DynamicInjection项目启动时,动态注入启动Services目录下的所有Web Api服务。
Service A
[RoutePrefix("api/ServiceA")] public class ServiceAController : ApiController { [Route("Values")] [HttpGet] public List<string> Values() { return new List<string> { "value1", "value2" }; } [Route("Version")] [HttpGet] public string Version() { return "Service A, version 1.0.0"; } }
Service B
[RoutePrefix("api/ServiceB")] public class ServiceBController : ApiController { [Route("Values")] [HttpGet] public List<string> Values() { return new List<string> { "value3", "value4" }; } [Route("Version")] [HttpGet] public string Version() { return "Service B, version 1.0.0"; } }
功能实现
添加Owin Self Host
首先我们要在DynamicInjection项目添加Owin Self Host库。
在Package Manage Console中输入以下命令
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
然后修改Program.cs代码,创建一个Startup类,使用Owin Self Host启动一个Web服务
class Program { static void Main(string[] args) { string baseAddress = "http://localhost:9002/"; using (WebApp.Start<Startup>(url: baseAddress)) { Console.WriteLine("App Server started."); Console.ReadLine(); } } public class Startup { public void Configuration(IAppBuilder appBuilder) { } } }
启动项目,如果出现以下界面,就表明Web服务启动成功了
添加Autofac
程序启动成功之后,我们需要继续修改Program.cs。
首先,我们需要引入Autofac库
在Package Manage Console中输入以下命令
Install-Package Autofac.WebApi2.Owin
引入完成之后,我们需要在Programs.cs中添加代码,在启动服务之前,我们需要从Services目录中读取所有的dll, 使用反射将其加载在内存中,如果发现dll存在继承自ApiController类的子类时,就将其注册到当前Web服务中。
public class Startup { public void Configuration(IAppBuilder appBuilder) { //定义Autofac容器创建器 var builder = new ContainerBuilder(); //注入Api服务 BuildControllers(builder); //生成Autofac容器 var container = builder.Build(); //在Owin管道中加入Autofac中间件 appBuilder.UseAutofacMiddleware(container); HttpConfiguration config = new HttpConfiguration(); config.DependencyResolver = new AutofacWebApiDependencyResolver(container); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); appBuilder.UseAutofacWebApi(config); appBuilder.UseWebApi(config); } private void BuildControllers(ContainerBuilder builder) { var searchFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), SearchPath); foreach (var file in Directory.EnumerateFiles(searchFolder, "*.dll", SearchOption.AllDirectories)) { try { var assembly = Assembly.LoadFrom(file); var exportedTypes = assembly.GetExportedTypes(); if (exportedTypes.Any(t => t.IsSubclassOf(typeof(ApiController)))) { Console.WriteLine("Started service " + assembly.FullName); builder.RegisterApiControllers(assembly).InstancePerRequest(); } } catch { } } } }
最终效果
启动项目之后,控制台结果如下,2个Web Api服务被启动
然后我们在Postman中测试一下, Web Api是否能被正确调用
使用Autofac动态注入启动Api服务的更多相关文章
- 为你的机器学习模型创建API服务
1. 什么是API 当调包侠们训练好一个模型后,下一步要做的就是与业务开发组同学们进行代码对接,以便这些‘AI大脑’们可以顺利的被使用.然而往往要面临不同编程语言的挑战,例如很常见的是调包侠们用Pyt ...
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
- springboot如何通过apollo动态去注册dubbo服务
参考相关文章: apollo官方文档: https://dubbo.apache.org/zh/docs/v2.7/user/configuration/configuration-load-pro ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入
一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...
- 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入
PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...
- 【Dalston】【第五章】API服务网关(Zuul) 上
微服务场景下,每一个微服务对外暴露了一组细粒度的服务.客户端的请求可能会涉及到一串的服务调用,如果将这些微服务都暴露给客户端,那么客户端需要多次请求不同的微服务才能完成一次业务处理,增加客户端的代码复 ...
- Android Service总结03 之被启动的服务 -- Started Service
Android Service总结03 之被启动的服务 -- Started Service 版本 版本说明 发布时间 发布人 V1.0 添加了Service的介绍和示例 2013-03-17 Sky ...
- 利用Vert.x构建简单的API 服务、分布式服务
目前已经使用Vertx已经一年多了,虽然没有太多的造诣,但也已在项目中推广了下:从最初的vertx搭建web服务,到项目上线运营,还算比较稳定.再到后来尝试搭建基于vertx的分布式服务,一路下来也积 ...
- ASP.NETCore使用AutoFac依赖注入
原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...
随机推荐
- 结对开发项目--石家庄地铁web版
一.功能要求 1.数据库设计:将石家庄地铁线路图的各个线路,各个站点,换乘信息等用数据库的形式保存起来,应该保存的信息有 {线路号,线路的各个站名,车站的换乘信息}. 2.站点查询:用户可以输入任一一 ...
- 2013年省赛H题
2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...
- 分分钟解决MySQL查询速度慢与性能差
阅读本文大概需要 6 分钟. 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够 ...
- Markdown初使用
Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 相比WYSIWYG编辑器 优点:1.因为是纯文本,所以只要支持Markdown的地方都能获得一样的 ...
- 网防G01管理检测系统Linux版安装
监测包内容: gov_defence_agent_x64_linux_v3.1.18.tar.gz LinuxVersion(datalog.sh getlog.sh setup.sh) 1. ...
- Java 将键盘中的输入保存到数组
import java.util.Scanner; import java.util.InputMismatchException; public class saveInputToArr { pub ...
- React修改state(非redux)中数组和对象里边的某一个属性的值
在使用React时,会经常需要处理state里边设置的初始值以达到我们的实际需求,比如从接口获取到列表数据后要赋值给定义的列表初始值,然后数据驱动view视图进而呈现在我们眼前,这种最简单的赋值方式实 ...
- vue组件里定时器销毁问题
我在a页面写一个定时,让他每秒钟打印一个1,然后跳转到b页面,此时可以看到,定时器依然在执行.这样是非常消耗性能的.如下图所示: 解决方法1: 首先我在data函数里面进行定义定时器名称: data( ...
- Linux 系统中的内部与外部命令
linux中的命令大致可分为两类,内部命令和外部命令: 内部命令(builtin command):也称shell内嵌命令 外部命令(external command):存放在一个文件中,使用时需要去 ...
- web测试实践——day01
一.任务进展情况 主要是找寻网站的bug,分析bug的严重程度.同时找了本专业的同学进行博客园系统的使用. 二.存在的问题 由于上线的网站做的比较完善,导致找寻bug比较困难. 三.解决方法 对此我们 ...