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

Find all references with WCF OperationContract and DataContracts

我想弄清楚是否有办法 "Find all references"(使用 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 服务中调用的方法,情况并非如此:

在上面,对 interface/method 的唯一引用是 interface/method。我知道我希望的参考会在那里(来自主要方法):

var results = client.GetData(42);

不存在,因为生成了客户端,实际上并不是我的 Service1 实现...但是有没有办法改变它?

在现实世界中,我们有一个包含数千种方法的 WCF 层,其中许多方法未被使用 - 但我不能依赖代码 Lens/Find 所有引用来做出此决定。有什么办法可以改变这种行为吗?

because the client is generated, and is not actually my Service1 implementation

这就是问题的根源。

您是对的 - 您的代码分析器无法确定您从客户端发出的 GetData() 调用在语义上与您在界面上定义的 GetDate() 服务操作相同,因为从二进制的角度来看,它们被定义为两种完全不同的类型。

其根源在于您使用的是服务引用。 WCF 提供服务引用作为连接到服务的默认 方式,但在我看来,服务引用是有问题的,应该避免。

幸运的是,WCF 提供了另一种通过 ChannelFactory<T> 的用户使用和调用服务的方式。使用它而不是服务引用时,您将获得的众多好处之一是您的客户端将通过对包含您的服务定义的程序集的二进制引用来使用服务接口。

这将允许 code lens 等工具将对您的接口方法的引用直接解析到您的消费客户端。