Autofac整合MVC:
1) 指定Autofac工厂替换默认工厂,在【Program.cs】中的【CreateHostBuilder】方法中指定。
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }).UseServiceProviderFactory(new AutofacServiceProviderFactory());
2) 在【Startup.cs】类中增加一个【ConfigureContainer】方法,用来注册服务关系。
public void ConfigureContainer(ContainerBuilder containerBuilder) { // Register your own things directly with Autofac, like: containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>(); }
3) 通过控制器构造函数注入,获取实例。
获取方式与Asp.Net Core中的 Controller injection 一致。
对于Asp.Net Core 保留的依赖注入方法也是可以使用的,因为Autofac在对服务进行注册时会将IServicesCollection中已经注册的服务整合进来。
控制器中的属性注入:
1) 通过在用service collection注册MVC时指定 AddControllersAsServices()
, 你可以改变这个行为. 这么做可以在service provider factory调用 builder.Populate(services)
时自动注册控制器类型到 IServiceCollection
.
2) 在ConfigureContainer中注册控制器为服务,控制器中的服务便可以通过属性注入.
public void ConfigureServices(IServiceCollection services) { // Add controllers as services so they'll be resolved. services.AddMvc().AddControllersAsServices(); } public void ConfigureContainer(ContainerBuilder builder) { // If you want to set up a controller for, say, property injection // you can override the controller registration after populating services. builder.RegisterType<MyController>().PropertiesAutowired(); }
如以下例子: 我需要将两个服务分别注入HomeController,一个ITestServiceA通过默认的构造函数注入,ITestServiceB通过属性注入,而且ITestServiceB中又属性注入了ITestServiceA。
注册方式: