1、Autofac的配置
1 )通过Microsoft.Extensions.DependencyInjection
包在.NET Core应用程序中使用Autofac。
在Nuget管理程序中,搜索'Autofac.Extensions.DependencyInjection
' =》选中然后点击'安装
'。
相关文档:VS(Visual Studio)中Nuget的使用
2 )在应用程序启动期间(例如,在Program
或 Startup
类中)...
- 在
IServiceCollection
使用框架扩展中注册服务。 - 将这些注册的服务填充到Autofac中。
- 添加
Autofac
注册和重写。 - 建立你的容器。
AutofacServiceProvider
使用容器创建一个。
2、在.NET Core中使用Autofac示例代码
public class Program { public static void Main(string[] args) { // Microsoft.Extensions.DependencyInjection.ServiceCollection //具有其他.NET Core库提供的扩展方法 //使用DI的注册服务 var serviceCollection = new ServiceCollection(); // Microsoft.Extensions.Logging包提供了这个单行程序 //添加日志记录服务 serviceCollection.AddLogging(); var containerBuilder = new ContainerBuilder(); //一旦您在ServiceCollection中注册了所有内容,请致电 //填充以将这些注册带入Autofac。 这是 //就像在集合中的事物列表上的foreach一样 //将它们添加到Autofac。 containerBuilder.Populate(serviceCollection); //进行Autofac注册。 订单很重要! //如果你在调用Populate之前制作它们,那么 // ServiceCollection中的注册将覆盖Autofac //注册; 如果你在Populate之后制作它们,那就是Autofac //注册将覆盖。 你可以进行注册 //在Populate之前或之后,但是你选择。 containerBuilder.RegisterType<MessageHandler>().As<IHandler>(); //创建一个新的AutofacServiceProvider使容器成为可能 //使用Microsoft IServiceProvider可供您的应用使用 //接口所以你可以使用那些抽象而不是 //直接绑定到Autofac。 var container = containerBuilder.Build(); var serviceProvider = new AutofacServiceProvider(container); } }
注意:不必使用Microsoft.Extensions.DependencyInjection
。如果您没有编写需要它的.NET Core应用程序,或者如果您没有使用其他库提供的任何DI扩展,则可以直接使用Autofac。您也可能只需要调用Populate()
而不需要AutofacServiceProvider
。使用对您的应用有意义的部分。
3、使用子范围作为根
在复杂的应用程序中,您可能希望Populate()
在子生命周期范围内使用注册的服务。例如,一个自行托管ASP.NET Core组件的应用程序可能希望保留MVC注册并与主容器隔离。该Populate()
方法提供了一个重载,允许您指定一个标记的子生命周期范围,该范围应该充当项目的“容器”。
注意:如果使用此方法,则无法使用ASP.NET Core支持IServiceProviderFactory{TContainerBuilder}(ConfigureContainer支持
)。这是因为IServiceProviderFactory{TContainerBuilder}
假设它在根级别工作。
public class Program { private const string RootLifetimeTag = "MyIsolatedRoot"; public static void Main(string[] args) { var serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(); var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterType<MessageHandler>().As<IHandler>(); var container = containerBuilder.Build(); using(var scope = container.BeginLifetimeScope(RootLifetimeTag, b => { b.Populate(serviceCollection, RootLifetimeTag); })) { /此service provider可以访问全局 singletons //和注册,但登记的东西是“singletons” //在服务集合中将根据此“rooted” //子范围,对应用程序的其余部分不可用。 // //显然,在这个使用块中没有超级帮助, //很可能你会在app启动时创建范围,保留它 //在应用程序生命周期内,并手动处理它 //在应用程序关闭期间 var serviceProvider = new AutofacServiceProvider(scope); } } }