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);
}
}
}