1

「すべての参照を検索」する方法があるかどうかを調べようとしています (ソリューション全体で Control+F を使用するのではなく、VS 機能を使用します)。WCF データと OperationContracts に関しては。不明な場合:

namespace WcfTestReferences
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world");

            DoStuff();

            ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
            var results = client.GetData(42);

            Console.WriteLine(results);
        }

        static void DoStuff() { }
    }
}

namespace WcfTestReferences.WCFApp
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
    }

    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
    }
}

解決策は次のようになります。

ここに画像の説明を入力

さて、DoStuff()コードレンズで見ると、実際にはそれへの参照があることがわかります:

ここに画像の説明を入力

ただし、wcf サービスで呼び出されるメソッドについては、同じことが当てはまりません。

ここに画像の説明を入力 ここに画像の説明を入力

上記では、インターフェイス/メソッドへの唯一の参照はインターフェイス/メソッドです。私が望んでいた参照がそこにあることを理解しています(メインメソッドから):

var results = client.GetData(42);

Service1クライアントが生成され、実際には私の実装ではないため、そこにはありません...しかし、これを変更する方法はありますか?

現実の世界では、何千ものメソッドを含む WCF レイヤーがあり、その多くは使用されていませんが、コード レンズ/すべての参照の検索に頼ってこの決定を行うことはできません。この動作を変更する方法はありますか?

4

1 に答える 1

1

クライアントが生成され、実際には私の Service1 実装ではないため

これが問題の根本です。

おっしゃる通りです。クライアントから実行している GetData() 呼び出しが、インターフェイスで定義した GetDate() サービス操作と意味的に同じであることをコード アナライザーが判断する方法はありません。それらは 2 つの完全に異なるタイプで定義されます。

これの根本は、サービス参照を使用していることです。WCF は、サービスに接続するための既定の方法としてサービス参照を提供しますが、私の意見では、サービス参照には問題があり、避けるべきです。

幸いなことに、WCF には、 のユーザーを介してサービスを使用および呼び出す別の方法が用意されていますChannelFactory<T>。サービス参照の代わりにこれを使用すると得られる多くの利点の 1 つは、サービス定義を含むアセンブリへのバイナリ参照を介して、クライアントがサービス インターフェイスを使用できることです。

これにより、コード レンズなどのツールがインターフェイス メソッドへの参照を消費クライアントに直接解決できるようになります。

于 2016-04-06T13:26:50.103 に答える