C# Castle WCF设施| Windows服务托管

C# Castle WCF设施| Windows服务托管,c#,wcf,c#-4.0,castle-windsor,wcffacility,C#,Wcf,C# 4.0,Castle Windsor,Wcffacility,我正试图在我的WCF项目中使用Castle WCF集成工具,但中途迷失了方向。你能帮帮我吗 因此,情况如下: 我有一个WCF服务库,它通过TCP托管在Windows服务中。 以下是我的WCF服务库中的内容: 服务Impl: [ServiceContract] public interface ICalculatorService { [OperationContract] int Add(int x, int y); } publ

我正试图在我的WCF项目中使用Castle WCF集成工具,但中途迷失了方向。你能帮帮我吗

因此,情况如下:

我有一个WCF服务库,它通过TCP托管在Windows服务中。 以下是我的WCF服务库中的内容: 服务Impl:

[ServiceContract]
    public interface ICalculatorService
    {
        [OperationContract]
        int Add(int x, int y);
    }

    public class CalculatorService : ICalculatorService
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
配置:

 <system.serviceModel>
    <services>
      <service name="namespace.CalculatorService">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration=""
          contract="namespace.iCalculatorService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/CalculatorService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

容器配置这是在WCF项目中,如果我将所有内容注册到castle(我不确定WCF设施应该注册在哪里,它应该从WCF服务还是从承载WCF服务的Windows服务注册)

公共类配置ContainerCastle
{
私有只读IWindsorContainer;
公共配置ContainerCastle(IWindsorContainer容器)
{
this.container=容器;
}
public void Configure()
{
//任何组件注册。
container.Register(Component.For().ImplementedBy());
//所有其他组件注册。
}
}
以下是我的Windows服务中的内容:

 public class Host<T>:ServiceBase
    {
     private ServiceHost serviceHost = null;
            protected override void OnStart(string[] args)
            {
                if (serviceHost != null)
                {
                    serviceHost.Close();
                }

                // How do I call the DefaultServiceHostFactory and start the service?
                // Should I call the WCF facility from here or from WCF service library?
//                var container = new WindsorContainer();
  //              var configureContainer = new DataServicesConfigureContainer(container);
    //            var hostFactory = new DefaultServiceHostFactory(container.Kernel);

                serviceHost = new ServiceHost(typeof (T));
                serviceHost.Open();
            }

            protected override void OnStop()
            {
                if (serviceHost == null)
                    return;

                serviceHost.Close();
                serviceHost = null;
            }
    }
公共类主机:ServiceBase
{
私有ServiceHost ServiceHost=null;
启动时受保护的覆盖无效(字符串[]args)
{
如果(serviceHost!=null)
{
serviceHost.Close();
}
//如何调用DefaultServiceHostFactory并启动服务?
//我应该从这里还是从WCF服务库呼叫WCF设施?
//var container=新的WindsorContainer();
//var configureContainer=新的DataServiceConfigureContainer(容器);
//var hostFactory=新的DefaultServiceHostFactory(container.Kernel);
serviceHost=新的serviceHost(类型(T));
Open();
}
受保护的覆盖void OnStop()
{
如果(serviceHost==null)
返回;
serviceHost.Close();
serviceHost=null;
}
}
我的Windows服务配置(app.config)与我的WCF服务相同,逐行逐行

现在的问题是,我如何将这一切与WCF设施连接起来?我见过很多使用http和global.asax的示例,但没有一个用于windows服务。你能帮忙吗?即使是一个适当的链接也会有所帮助

谢谢,
-Mike

首先是一个小问题-如果需要TCP,则需要使用
net.TCP
协议指定基址,如下所示:

<add baseAddress="net.tcp://localhost:8732/CalculatorService" />
也就是说,温莎现在负责在WCF客户端连接到该服务时提供该服务(不要相信我,在您的计算器服务中添加一些依赖项,并惊叹于这一奇迹)


您可能想考虑现在完全取消配置文件,而使用温莎FLUENT API——这是相当直观的,只是看看您可以通过什么进入ASWCFService方法,然后走开(或者只需使用配置文件)。.

首先是一个小问题-如果需要TCP,则需要使用
net.TCP
协议指定基址,如下所示:

<add baseAddress="net.tcp://localhost:8732/CalculatorService" />
也就是说,温莎现在负责在WCF客户端连接到该服务时提供该服务(不要相信我,在您的计算器服务中添加一些依赖项,并惊叹于这一奇迹)

您可能想考虑现在完全取消配置文件,而使用温莎FLUENT API——这是相当直观的,只是看看您可以通过什么进入ASWCFService方法,然后走开(或者只需使用配置文件)。

public void Configure()
{
    container.AddFacility<WcfFacility>();

    // Any component registration.
    container.Register(Component
        .For<ICalculatorService>()
        .ImplementedBy<CalculatorService>()
        .AsWcfService());

    //All other component registration.
}