2012-05-28 3 views
1

Я пытаюсь использовать средство интеграции Castle WCF в моем проекте WCF, но потерялся в пути. Не могли бы вы помочь мне?Замок WCF Facility | Windows Service Hosting

Итак, вот ситуация:

У меня есть службы WCF библиотека, которая размещена внутри службы Windows через TCP. Ниже то, что в моей службы WCF библиотеки: службы осущ:

[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; 
      } 
    } 

И моя конфигурация (app.config) для службы Windows такой же, как моя служба WCF, буквально построчно.

Теперь вопрос в том, как мне подключить все это вместе с установкой WCF? Я видел множество примеров с использованием http и global.asax, но ни один из них для служб Windows. Не могли бы вы помочь? Даже подходящая ссылка на него будет полезна.

Спасибо, -Mike

ответ

1

Прежде всего маленькая точка - если Вы желаете TCP необходимо указать базовый адрес, используя протокол net.tcp как так:

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

Но это ISN» т ваш вопрос, так дробильно на ...

(я не уверен, где ФОС объект должен быть зарегистрирован, будь то должны быть зарегистрированы из службы WCF или из службы Windows, на которой размещается служба WCF).

Я хотел бы предложить вам зарегистрировать объект где-то близко, где вы зарегистрировать услугу. Итак, в Библиотеке услуг 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. 
} 

И вот оно - Windsor теперь отвечает за обслуживание службы, когда клиент WCF подключается к ней (не верьте мне - добавьте некоторые зависимости в свой калькулятор и удивляйтесь удивлению).

Возможно, вы захотите рассмотреть вопрос об удалении с конфигурационным файлом в настоящее время и использовать Fluent API Windsor вместо этого - он довольно интуитивно понятен, просто взгляните на то, что вы можете передать в метод AsWcfService и уйти (или просто придерживаться с конфигурационным файлом).