1

我试图弄清楚是否有办法“查找所有引用”(使用 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 来做出这个决定。有没有办法改变这种行为?

4

1 回答 1

1

因为客户端是生成的,实际上并不是我的Service1实现

这是问题的根源。

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

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

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

这将允许代码镜头之类的工具将对您的接口方法的引用直接解析给您的消费客户端。

于 2016-04-06T13:26:50.103 回答