簡體   English   中英

使用 WCF OperationContract 和 DataContracts 查找所有引用

[英]Find all references with WCF OperationContract and DataContracts

我想弄清楚是否有辦法“查找所有引用”(使用 VS 功能,而不是 Control+F 整個解決方案)。 當涉及到 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 層,其中許多方法沒有使用 - 但我不能依賴 Code Lens/Find all references 來做出這個決定。 有什么辦法可以改變這種行為嗎?

因為客戶端是生成的,實際上不是我的 Service1 實現

這是問題的根源。

您是對的 - 您的代碼分析器無法確定您從客戶端發出的 GetData() 調用在語義上與您在接口上定義的 GetDate() 服務操作相同,因為從二進制角度來看它們被定義為兩種完全不同的類型。

其根源在於您正在使用服務引用。 WCF 提供服務引用作為連接到服務的默認方式,但在我看來,服務引用是有問題的,應該避免。

幸運的是,WCF 提供了另一種通過ChannelFactory<T>的用戶使用和調用服務的方法。 使用它而不是服務引用時,您將獲得的眾多好處之一是,您的客戶端將通過對包含服務定義的程序集的二進制引用來使用服務接口。

這將允許諸如代碼鏡頭之類的工具將您的接口方法的引用直接解析給您的消費客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM