1

自分の WCF プロジェクトで Castle WCF 統合機能を使用しようとしていますが、道に迷ってしまいました。助けてもらえますか?

したがって、ここに状況があります:

TCP 経由の Windows サービス内でホストされている WCF サービス ライブラリがあります。以下は、私の WCF Service Library にあるものです: Service 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 サービスの例はありません。助けていただけますか?それへの適切なリンクでさえ役に立ちます。

ありがとう -マイク

4

1 に答える 1

1

まず最初に小さなポイント - TCP が必要な場合は、次のnet.tcpようにプロトコルを使用してベース アドレスを指定する必要があります。

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

しかし、それはあなたの質問ではありません。

(WCFサービスから登録する必要があるのか​​、WCFサービスをホストするWindowsサービスから登録する必要があるのか​​ 、wcf機能をどこに登録する必要があるのか​​ わかりません)。

サービスを登録する場所に近い場所に施設を登録することをお勧めします。したがって、WCF Service Library では、実際に投稿したコードのビットは、それを登録するのに適した場所です (登録されている限り、場所に大きな違いはないと思います)。

問題は、これを 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 クライアントがサービスに接続したときにサービスを提供する役割を担っています (信じないでください。CalculatorService にいくつかの依存関係を追加してください)。

構成ファイルを完全に廃止し、代わりに Windsor fluent API を使用することを検討することをお勧めします。AsWcfService メソッドに渡すことができるものを確認するだけで非常に直感的です (または、構成ファイルに固執するだけです)。 )。

于 2012-07-04T14:17:22.673 に答える