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
使用提供的实现替换这种行为。