用Rider写一个由Autofac管理资源的WebAPI应用程序

时间:2022-09-11 04:19:12

一:步骤和上一篇创建控制台项目一样,不过这次选择的是.net core区域下的Asp.net web application,Type里选择Web API(Web API类似java里的SpringBoot,而MVC则类似java里的SpringMVC);

二:注意它会默认创建一个在项目根目录下的Controllers目录,这个在实际项目里一般不会这么做,而是写一个尽可能简单的WebApi启动Project,而且这个Project一般的命名规范是Com.Xxx.ArtifactName.Entrance;

然后在创建其他的项目供这个启动项目来引用使用,在其他项目里命名也是Com.Xxx.ArtifactName.UserModule,表示这个是Artifact项目的User部分,然后才是Controller、Service、Service.Impl、Db、Db.Dao、Db.Service、Db.Service.Impl、Enums等等;

不过我们只是为了演示,所以这里就按创建的来;

三:我们为这个WebApi导入Autofac包,注意这次要导入一个额外的:Autofac.Extensions.DependencyInjection用于替换WebApi里默认的简单的IOC容器;

四:修改Startup类【注意这个类的实现是按照约定大于配置的方式,而不是通过实现什么接口来规定行为的】,找到public void ConfigureServices(IServiceCollection services),将它改为:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddControllersAsServices();
var builder = new ContainerBuilder();
builder.Populate(services);
// 这里还可以手动注入其他的如Service层的bean,不过可以register一个Module(不会管理这个对象只是起个过渡作用)然后在Module里去注册其他bean(可以扫描自己的配置和Assembly来实现自定义的一些配置)
var container = builder.Build();
return new AutofacServiceProvider(container);
}

  这里再强调一下,如果要管理已经注入的Controller,和注入及装配其他的Bean需要自己手动添加代码去注入,可以通过扫描自定义配置来实现Aop(Castle),和通过反射实现所有符合条件的bean的自动注入及通过反射实现这些bean的特定的属性的自动装配;

可以通过:Console.WriteLine(container.Resolve<IList<ValuesController>>().Count);得出是1,说明Controller注入到Autofac成功;