Bootstrap
本文主要介绍.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<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);
    }
  }
}