使用Autofac动态注入启动Api服务
2021-01-28 09:12
标签:url nta type from 动态 icon cell 子类 管道
Autofac(https://autofac.org/)是一款.NET的IOC组件,它可以和Owin, Web Api, ASP.NET MVC, .NET Core完美结合,帮助开发人员轻松解决程序中的依赖注入问题。 所谓的动态注入启动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 首先我们要在DynamicInjection项目添加Owin Self Host库。 在Package Manage Console中输入以下命令 然后修改Program.cs代码,创建一个Startup类,使用Owin Self Host启动一个Web服务 启动项目,如果出现以下界面,就表明Web服务启动成功了 程序启动成功之后,我们需要继续修改Program.cs。 首先,我们需要引入Autofac库 在Package Manage Console中输入以下命令 引入完成之后,我们需要在Programs.cs中添加代码,在启动服务之前,我们需要从Services目录中读取所有的dll, 使用反射将其加载在内存中,如果发现dll存在继承自ApiController类的子类时,就将其注册到当前Web服务中。 启动项目之后,控制台结果如下,2个Web Api服务被启动 然后我们在Postman中测试一下, Web Api是否能被正确调用 使用Autofac动态注入启动Api服务 标签:url nta type from 动态 icon cell 子类 管道 原文地址:https://www.cnblogs.com/lonelyxmas/p/11904975.htmlAutofac#
动态注入启动Web Api#
具体案例#

[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";
}
}
[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#
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
class Program
{
static void Main(string[] args)
{
string baseAddress = "http://localhost:9002/";
using (WebApp.Start
{
Console.WriteLine("App Server started.");
Console.ReadLine();
}
}
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
}
}
}
添加Autofac#
Install-Package Autofac.WebApi2.Owin
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 { }
}
}
}
最终效果#



