• 使用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是否能被正确调用

  • 相关阅读:
    [转]Modernizr的介绍和使用
    java动态代理使用详解
    ajax上传文件以及使用中常见问题处理
    cmd下查询端口占用以及根据进程id名称结束进程
    水平居中 垂直居中
    inline-block和float
    一起入门前端(三)
    一起入门前端(二)
    一起入门前端(一)
    WPF初学——自定义样式
  • 原文地址:https://www.cnblogs.com/lwqlun/p/9095060.html
Copyright © 2020-2023  润新知