我想使用Redis在我的Service Stack服务上调用服务操作。
我创建了一个简单的DTO作为消息请求,并按照演示页面注册了消息服务:
var messageService = m_Container.Resolve<RedisMqServer>();
messageService.RegisterHandler<SubscribeAddressRequest>(x => ServiceController.ExecuteMessage(x) );
messageService.Start();
ServiceStack实际收到这些消息,但我收到以下错误(来自我的Container):
No component for supporting the service ServiceStack.Messaging.IMessage was found.
这很奇怪,为什么ServiceStack要求将依赖项作为IMessage注入?我没有为IMessage注册任何提供商,所以我知道这会失败,但我没有看到任何提供商。我正在注册以下类型:
string[] RedisHosts = new string[] { (string)ConfigurationManager.AppSettings["RedisHost"] };
container.Register(
Component.For<IRedisClientsManager>().ImplementedBy<PooledRedisClientManager>().DependsOn(new { poolSize = 1000, poolTimeOutSeconds = 1, readWriteHosts = RedisHosts }),
Component.For<RedisMqServer>(),
Component.For<IMessageQueueClient>().UsingFactoryMethod((k, c) =>
{
return k.Resolve<RedisMqServer>().CreateMessageQueueClient();
})
);
答案 0 :(得分:1)
看起来这是你正在使用的Container的一个问题,我不确定它为什么要求这个,它可能与你的IOC的自动引导程序扫描过程有关,但它不是你想要的东西希望从国际奥委会解决。为了帮助调查, RegisterHandler 回调中的类型为IMessage<T>
,例如:
messageService.RegisterHandler<SubscribeAddressRequest>(x // <- IMessage<T>
答案 1 :(得分:1)
我找到了问题的原因,即我的IoC容器(Castle Windsor)在RedisMqServer上使用动态Func注入RequestFilter和ResponseFilter,目的是从容器中解析IMessage(使用TypedFactoryFacility时)
这是因为委托工厂是TypedFactoryFacility的一部分(我通常使用接口工厂)。
我在使用Typed Factory Facility时禁用了Castle Windsor代表工厂的自动启用,从而解决了这个问题: