Unity 5.11中如何设置默认LifetimeManager?
Unity 5.11 设置默认 LifetimeManager 的实现方案
在Unity 5.11版本中,原3.5版本依赖注入扩展里设置默认生命周期的API已发生变更,你提到的Context.Policies.Set<ILifetimePolicy>方法参数要求更严格,以下是适配新版的实现方式:
核心实现思路
通过自定义Unity容器扩展,监听容器的Registering事件,当类型注册时未显式指定LifetimeManager,则为其设置默认的生命周期策略。
代码示例
自定义扩展类
using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.ObjectBuilder; using System; public class DefaultLifetimeExtension : UnityContainerExtension { private readonly LifetimeManager _defaultLifetime; public DefaultLifetimeExtension(LifetimeManager defaultLifetime) { _defaultLifetime = defaultLifetime ?? throw new ArgumentNullException(nameof(defaultLifetime)); } protected override void Initialize() { // 注册类型时触发的事件 Container.Registering += OnTypeRegistering; } private void OnTypeRegistering(object sender, RegisterEventArgs e) { // 仅当未指定生命周期时应用默认策略 if (e.LifetimeManager == null) { // 构建键需明确指定类型和名称,匹配新版Set方法要求 var buildKey = new NamedTypeBuildKey(e.TypeTo, e.Name); Context.Policies.Set<ILifetimePolicy>(_defaultLifetime, buildKey); } } }
容器使用方式
// 初始化容器 var container = new UnityContainer(); // 添加自定义扩展,设置默认生命周期为容器单例(可替换为其他LifetimeManager,比如TransientLifetimeManager) container.AddNewExtension<DefaultLifetimeExtension>(new ContainerControlledLifetimeManager()); // 后续注册类型时,若未指定生命周期,将自动使用默认策略 container.RegisterType<IService, ServiceImpl>();
关键说明
- Unity 5.x重构了策略存储系统,
Set<ILifetimePolicy>方法要求必须传递准确的NamedTypeBuildKey,确保生命周期策略与目标类型/名称绑定正确。 - 事件判断
e.LifetimeManager == null是为了避免覆盖开发者显式指定的生命周期策略,仅对未声明的类型应用默认规则。
内容的提问来源于stack exchange,提问作者DBPaul
相关产品推荐
相关产品推荐

