ServiceStack Redis Messaging - IMessage?

时间:2013-09-27 14:30:38

标签: servicestack messaging

我想使用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();
            })
        );

2 个答案:

答案 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代表工厂的自动启用,从而解决了这个问题:

Remove components in Castle Windsor 3