我正在尝试让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将建筑责任推迟到城堡?
答案 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:
(在正常位置指定它们 - 有更多信息可用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"))));