如何在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
相关产品推荐
相关产品推荐

