Castle 3.0 WCF工具 - 不解析服务构造函数中的参数

时间:2012-03-13 15:56:02

标签: wcf castle

我正在尝试让Castle(3.0)将构造函数params注入到WCF服务中,就像这样

ServiceHostBase clientServiceHost = new Castle.Facilities.WcfIntegration.DefaultServiceHostFactory()
.CreateServiceHost(typeof(IClientExchange).AssemblyQualifiedName, new Uri[0]);

但是我收到以下异常'提供的服务类型无法作为服务加载,因为它没有默认(无参数)构造函数。'

ClientExchange类型的服务impl采用IProviders类型的构造函数参数

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class ClientExchangeService : ExchangeService, IClientExchange
{
    public ClientExchangeService(IProviders providers)
        : base(providers) { }
}

我的windsor安装程序如下所示:

container.AddFacility<WcfFacility>()
.Register
(
  Component.For<IProviders>().Instance(Providers.DbInstance),
  Component.For<IClientExchange>().ImplementedBy<ClientExchangeService>(),
);

目前看起来WCF正试图在没有城堡提供依赖性的情况下新建服务。尝试了一些替代示例,但许多是针对之前版本的castle pre 3.0。我必须在某个地方错过一个钩子?我如何告诉WCF将建筑责任推迟到城堡?

1 个答案:

答案 0 :(得分:4)

我认为:how do i pass values to the constructor on my wcf service可能是您问题的答案。或者,对于Windsor特定的内容,这可能会有所帮助:Dependency Injection in WCF Using Castle Windsor

<强>更新

好的,所以我想我已经弄明白了。首先问题是这个属性:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

如果你没有指定Windsor能够完全正确地将依赖项注入到构造函数中 - 那就不能。

通过查看该属性here的描述,我发现您希望您的服务成为单身,因此,这是Windsor的默认设置,您可以简单地删除该属性,它应该开始为您工作并且表现得很好如你所料。

您可能感兴趣的另外两种生活方式专门针对WCF:

  • LifestylePerWcfOperation()
  • LifestylePerWcfSession()

(在正常位置指定它们 - 有更多信息可用here

顺便提一下,您根本不必执行ServiceHostBase内容,而是可以使用AsWcfService扩展方法,这样做(我个人更喜欢这样做):

container
    .AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero)
    .Register(
        Component
            .For<IProviders>()
            .Instance(Providers.DbInstance),
        Component
            .For<IClientExchange>()
            .ImplementedBy<ClientExchangeService>()
            .AsWcfService(new DefaultServiceModel()
                .AddEndpoints(WcfEndpoint
                    .BoundTo(new BasicHttpBinding())
                    .At("http://localhost:8000/ClientExchangeService"))));