如何在Castle Windsor

时间:2015-08-21 21:33:37

标签: c# castle-windsor

我在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

1 个答案:

答案 0 :(得分:1)

我用WCF做了很多年,但我认为这与Windsor没什么关系。您看到的异常(System.InvalidOperationException)是由您的客户端的构造函数抛出的,而不是Windsor。

事实上,如果你要更换你的 var service = container.Resolve<IDentalRecordService>(); var service = new DentalRecordServiceClient();结果将是相同的。

您需要确保您的WCF配置正确无误。

对于更新后的答案,您可以使用内联依赖项as explained in the documentation配置服务。