2012-05-28 192 views
1

我想在我的WCF項目中使用城堡WCF集成設施,但迷路了。你能幫我解決嗎?城堡WCF設施| Windows服務託管

所以,這裏的情況是:

我有一個WCF服務庫,這是一個Windows服務中通過TCP主持。 下面是什麼在我的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服務還是從承載WCF服務的Windows服務註冊。

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

首先一個小點的 - 如果你是想TCP則需要使用net.tcp協議,像這樣指定的基地址:

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

但是,這ISN」牛逼你的問題,所以在破碎...

(我不知道在哪裏的WCF設施應進行登記,無論是應該從WCF服務或託管WCF服務的Windows服務註冊)。

我建議你在接近你註冊服務的地方註冊設施。所以,在WCF服務庫中 - 實際上你發佈的代碼位是一個很好的註冊地點(只要它被註冊了,我認爲它在哪裏並沒有太大的區別)。

現在的問題是,我如何將這一切與WCF設施連接在一起?我已經看到很多使用http和global.asax的例子,但沒有一個用於windows服務。你能幫忙嗎?即使是適當的鏈接也是有幫助的。

倒也乾脆實際上 - 如果你想保持你的配置在您的配置文件你可以改變你的Configure方法是這樣的(我假設你已經有了一個參考Castle.Facilities.WcfIntegration):

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 fluent API--它非常直觀,只需查看您可以傳入AsWcfService方法的內容,然後離開(或僅僅粘貼與配置文件)。