我在Castle Windsor 3.3.0.0
中配置类的使用时遇到问题班级是这样的:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class DentalRecordServiceClient : ClientBase<IDentalRecordService>, IDentalRecordService
{
public DentalRecordServiceClient()
{
}
public DentalRecordServiceClient(string endpointConfigurationName) : base(endpointConfigurationName)
{
}
public DentalRecordServiceClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress)
{
}
public DentalRecordServiceClient(string endpointConfigurationName, EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress)
{
}
public DentalRecordServiceClient(Binding binding, EndpointAddress remoteAddress) : base(binding, remoteAddress)
{
}
public int GetNumberOfVisits(string fullname, string city, DateTime dateOfBirth)
{
return base.Channel.GetNumberOfVisits(fullname, city, dateOfBirth);
}
}
我有两个相关的接口,如下所示:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[ServiceContractAttribute(ConfigurationName = "IDentalRecordService")]
public interface IDentalRecordService
{
[OperationContractAttribute(Action = "http://tempuri.org/IDentalRecordService/GetNumberOfVisits", ReplyAction = "http://tempuri.org/IDentalRecordService/GetNumberOfVisitsResponse")]
int GetNumberOfVisits(string fullname, string city, DateTime dateOfBirth);
}
和此:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface IDentalRecordServiceChannel : IDentalRecordService, IClientChannel
{
}
My Castle Windsor配置如下:
container.Register(
Component.For<IDentalRecordService>()
.ImplementedBy<DentalRecordServiceClient>());
在我的代码中,我正试图通过这一行来解析服务:
var service = container.Resolve<IDentalRecordService>();
但是我收到以下错误:
Castle.MicroKernel.ComponentActivator.ComponentActivatorException:ComponentActivator:无法实例化DentalRecordServiceClient ----&GT; System.Reflection.TargetInvocationException:调用目标抛出了异常。 ----&GT; System.InvalidOperationException:无法在ServiceModel客户端配置部分中找到引用合同“IDentalRecordService”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。
我想我意识到我的Castle Windsor配置应该指定参数,因此调用DentalRecordServiceClient上的其他构造函数之一,但我不确定我需要如何或者需要什么数据来提供它。我完全可以传入虚拟数据,因此Resolve行可以工作。
有任何帮助吗?提前谢谢。
修改
好的,我发现我可以使用以下代码直接实例化对象:
var binding = new BasicHttpBinding();
var address = new EndpointAddress("http://myaddress");
var service = new DentalRecordServiceClient(binding, address);
我如何通过温莎城堡做到这一点?
TIA
答案 0 :(得分:1)
我用WCF做了很多年,但我认为这与Windsor没什么关系。您看到的异常(System.InvalidOperationException
)是由您的客户端的构造函数抛出的,而不是Windsor。
事实上,如果你要更换你的
var service = container.Resolve<IDentalRecordService>();
var service = new DentalRecordServiceClient();
结果将是相同的。
您需要确保您的WCF配置正确无误。
对于更新后的答案,您可以使用内联依赖项as explained in the documentation配置服务。