You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:58:09