城堡WCF设施| Windows服务托管

时间:2012-05-28 18:51:02

标签: 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);
    }

    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项目中我将所有内容注册到城堡(我不确定应该在哪里注册wcf工具,是否应该从WCF服务或从Windows注册托管WCF服务的服务。)

 public class ConfigureContainerCastle
    {
        private readonly IWindsorContainer container;

        public ConfigureContainerCastle(IWindsorContainer container)
        {
            this.container = container;
        }

        public void Configure()
        {
            // Any component registration.
            container.Register(Component.For<ICalculatorService>().ImplementedBy<CalculatorService>());
            //All other component registration.
        }
    }

以下是我的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;
            }
    }

我的Windows服务配置(app.config)与我的WCF服务相同,逐字逐行。

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

谢谢, -Mike

1 个答案:

答案 0 :(得分:1)

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

<add baseAddress="net.tcp://localhost:8732/CalculatorService" />

但那不是你的问题,所以要紧张......

  
    

(我不确定应该在哪里注册wcf工具,是否应该从WCF服务或托管WCF服务的Windows服务注册。)

  

我建议你在靠近注册服务的地方注册设施。所以,在WCF服务库中 - 实际上你发布的代码位是一个很好的注册位置(只要注册它我不认为它在哪里有很大的不同)。

  
    

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

  

实际上非常简单 - 如果您想在配置文件中保留配置,您可以像这样更改Configure方法(我假设您已经引用了Castle.Facilities.WcfIntegration):< / p>

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

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

    //All other component registration.
}

就是这样 - 当WCF客户端连接到它时,Windsor现在负责提供服务(不要相信我 - 在您的CalculatorService中添加一些依赖项并惊叹于奇迹)。

您可能要考虑现在完全取消配置文件并使用Windsor流畅的API - 它非常直观,只需查看您可以传递到AsWcfService方法的内容并远离您(或者只是坚持使用)配置文件)。