开发手册 欢迎您!
软件开发者资料库

.NET Core Autofac 4.0的配置和使用示例代码

本文主要介绍.NET Core中依赖注入框架(DI)Autofac 4.0配置和使用示例。

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().As();     //创建一个新的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().As();    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);    }  }}