1

我想使用 Redis 在我的 Service Stack 服务上调用服务操作。

我创建了一个简单的 DTO 作为消息请求,并根据演示页面注册消息服务:

        var messageService = m_Container.Resolve<RedisMqServer>();
        messageService.RegisterHandler<SubscribeAddressRequest>(x => ServiceController.ExecuteMessage(x) );
        messageService.Start();

ServiceStack 实际上收到了这些消息,但我收到以下错误(来自我的容器):

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();
            })
        );
4

2 回答 2

1

看起来这是您正在使用的 Container 的问题,我不确定它为什么要这样做,这可能与您的 IOC 的自动引导扫描过程有关,但这不是您想要解决的问题国际奥委会。为了帮助调查,RegisterHandler回调中的类型为IMessage<T>,例如:

messageService.RegisterHandler<SubscribeAddressRequest>(x // <- IMessage<T>
于 2013-09-27T16:49:48.353 回答
1

我找到了问题的原因,即我的 IoC 容器(温莎城堡)正在使用动态 Func 在 RedisMqServer 上注入 RequestFilter 和 ResponseFilter,目的是从容器中解析 IMessage(使用 TypedFactoryFacility 时)。

这是因为委托工厂是 TypedFactoryFacility 的一部分(我通常使用接口工厂)。

我通过在使用 Typed Factory Facility 时禁用 Castle Windsor 委托工厂的自动启用来解决这个问题:

移除温莎城堡 3 中的组件

于 2013-10-01T13:41:12.953 回答