项目
版本

Autofac 生命周期事件

Autofac 提供了可以在实例生命周期各个阶段挂钩的事件。这些事件在组件注册(或通过附加到 IComponentRegistration 接口)时订阅。

OnPreparing

OnPreparing 事件在需要创建组件的新实例之前触发,但在此之前不会调用 OnActivating

此事件可用于指定 Autofac 在创建组件新实例时会考虑的自定义参数信息。

该事件的主要用途是模拟或拦截 Autofac 通常作为参数传递给组件激活的服务,方法是将提供的 PreparingEventArgs 参数的 Parameters 属性设置为任何自定义参数。

提示 在使用此事件设置参数之前,请考虑是否更适合作为注册时间进行定义,使用 参数注册

OnActivating

OnActivating 事件在使用组件之前触发。在这里,您可以:

在某些情况下,如 RegisterType<T>() ,注册的实际类型用于类型解析并由 ActivatingEventArgs 使用。例如,以下代码会导致运行时类转换异常:

builder.RegisterType<TConcrete>() // 失败:将抛出类型转换异常
       .As<TInterface>()          // 转换为 TConcrete
       .OnActivating(e => e.ReplaceInstance(new TInterfaceSubclass()));

一个简单的解决方案是分两步进行注册:

builder.RegisterType<TConcrete>().AsSelf();
builder.Register<TInterface>(c => c.Resolve<TConcrete>())
       .OnActivating(e => e.ReplaceInstance(new TInterfaceSubclass()));

OnActivated

OnActivated 事件在组件完全构建后触发。在这里,您可以执行依赖于组件完全构建的应用级任务 - 这应该是非常罕见的。

OnRelease

OnRelease 事件取代了组件的 标准清理行为 。实现了 IDisposable 的组件的标准清理行为是调用 Dispose() 方法。未实现 IDisposable 的组件或标记为外部拥有的组件的标准清理行为是无操作 - 不做任何事情。OnRelease 使用提供的实现替换这种行为。

在本文档中