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服务的更多相关文章

  1. 为你的机器学习模型创建API服务

    1. 什么是API 当调包侠们训练好一个模型后,下一步要做的就是与业务开发组同学们进行代码对接,以便这些‘AI大脑’们可以顺利的被使用.然而往往要面临不同编程语言的挑战,例如很常见的是调包侠们用Pyt ...

  2. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

  3. springboot如何通过apollo动态去注册dubbo服务

    参考相关文章: apollo官方文档:  https://dubbo.apache.org/zh/docs/v2.7/user/configuration/configuration-load-pro ...

  4. 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入

    一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...

  5. 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入

    PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...

  6. 【Dalston】【第五章】API服务网关(Zuul) 上

    微服务场景下,每一个微服务对外暴露了一组细粒度的服务.客户端的请求可能会涉及到一串的服务调用,如果将这些微服务都暴露给客户端,那么客户端需要多次请求不同的微服务才能完成一次业务处理,增加客户端的代码复 ...

  7. Android Service总结03 之被启动的服务 -- Started Service

    Android Service总结03 之被启动的服务 -- Started Service 版本 版本说明 发布时间 发布人 V1.0 添加了Service的介绍和示例 2013-03-17 Sky ...

  8. 利用Vert.x构建简单的API 服务、分布式服务

    目前已经使用Vertx已经一年多了,虽然没有太多的造诣,但也已在项目中推广了下:从最初的vertx搭建web服务,到项目上线运营,还算比较稳定.再到后来尝试搭建基于vertx的分布式服务,一路下来也积 ...

  9. ASP.NETCore使用AutoFac依赖注入

    原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...

随机推荐

  1. 实验二《Java面向对象程序设计》实验报告

    一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二.实验步骤 (一)单元测试 1.三种代码:伪代码.测 ...

  2. redis对键进行的相关操作

    redis对键操作的相关命令以及如何在python使用这些命令 redis对键操作的命令: 命令 语法 概述 返回值 Redis DEL 命令 del key [key ...] 该命令用于在 key ...

  3. scala_2

    一.scala类 . 在java中程序的入口是main方法->定义在class中 在scala中程序的入口是main方法->定义在object对象中 案例一: class People { ...

  4. Android常规布局方式和方法

    一.关于给控件添加ID属性 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xm ...

  5. Python数据分析实战

    Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...

  6. java用jsoup解析HTML

    步骤 1获取document对象 //方法一 Document doc = Jsoup.connect(网址).get() //方法二 Document doc = Jsoup.parse(html字 ...

  7. docker-maven-plugin插件设置Docker的buildArgs

    docker-maven-plugin是spotify出品的一款针对spring boot项目的docker插件,可将spring boot项目打包到docker镜像中. 如果在编译docker镜像时 ...

  8. python学习:字典

    字典 1.查询内存地址 a = 10 print(id(a)) b = a print(id(b)) b = 15 print(id(b)) 2. 数据类型 不可变类型:整型.字符串.元组 可变类型: ...

  9. 蓝鲸单机安装mysql问题记录

    1.注意默认启动用户为mysql 2.由于执行指令用的root,有些文件会生成为root用户 3.注意将datadir basedir  socket dir  修改称mysql  chown mys ...

  10. VUE-利用OSS BrowserJS-SDK实现阿里OSS前端上传

    项目中遇到利用阿里OSS上传文件,线上很多示例用到了各种SDK,却没有看到OSS BrowserJS-SDK相关示例,鉴于脑子不好使,记一下. 封装upload相关组件  使用npm安装SDK的开发 ...