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

如何在ServiceStack请求处理器中使用Unity容器注册的命名类型

问题解决方法

核心原因

ServiceStack 的 Service 类构造注入默认由其自身容器逻辑处理,Unity 的 [Dependency] 特性无法被自动识别,导致始终解析默认注册的 Clock1 实例。

解决方案

方案1:在Unity中显式配置服务的构造参数

修改Unity容器注册代码,为 test2RequestHandlers 指定构造时使用命名实例 TestClock:

public static IUnityContainer Create()
{
    var container = new UnityContainer();
    // 注册默认实例和命名实例
    container.RegisterType<ITest, Clock1>(new ContainerControlledLifetimeManager());
    container.RegisterType<ITest, TestClock>("TestClock", new ContainerControlledLifetimeManager());
    
    // 显式指定test2RequestHandlers的构造参数为命名的TestClock
    container.RegisterType<test2RequestHandlers>(
        new InjectionConstructor(new ResolvedParameter<ITest>("TestClock")));
    
    return container;
}

方案2:在Service中通过容器直接解析命名实例

在 test2RequestHandlers 的构造函数中,使用ServiceStack提供的 ResolveNamed 方法获取指定命名的实例:

public class test2RequestHandlers : Service
{
    private readonly ITest _clock;

    public test2RequestHandlers()
    {
        _clock = base.ResolveNamed<ITest>("TestClock");
    }
}

方案3:启用Unity属性注入(备选)

如果倾向于属性注入而非构造注入,可修改服务类并在Unity中配置属性注入:

public class test2RequestHandlers : Service
{
    public ITest Clock { get; set; }
}

然后在Unity注册时配置属性注入:

container.RegisterType<test2RequestHandlers>(
    new InjectionProperty("Clock", new ResolvedParameter<ITest>("TestClock")));

注意事项

确保ServiceStack已正确集成Unity容器,在AppHost的 Configure 方法中设置容器适配器:

public override void Configure(Container container)
{
    var unityContainer = Create();
    container.Adapter = new UnityContainerAdapter(unityContainer);
}

内容的提问来源于stack exchange,提问作者A_0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:35:25