覆盖WCF客户端方法

时间:2011-09-22 14:07:44

标签: c# wcf override

我有一个WCF服务,我在我的一个应用程序中使用。一切都工作正常,但我正在尝试创建一些具有相同API的测试类,但避免前往服务器获取其信息。例如:

// Goes to the server to get a list of names.  It might be a while.
MyClient client = new MyClient();
string[] theNames = client.GetSpitefulUsers();
...

// This is what I would use in a test case...
public FakeClient : MyClient
{
  ...
  public override string[] GetSpitefulUsers()
  {
    // This returns almost immediately, but I can't just override it because the
    // 'MyClient' definition is generated code.
    return new string[] {"Aldo", "Barry", "Cassie"};
  }
}

那么提供这类功能的最简单方法是什么,而不必采用聪明的黑客攻击,模拟库等?

2 个答案:

答案 0 :(得分:1)

WCF服务引用有一个接口,所以你的所有逻辑都应引用该接口,而不是服务客户端。在这种情况下,您将能够选择要传递给应用程序逻辑的实现(真实或虚假)。

假设你的WCF服务接口是这样的:

public interface IWcfInterface {
     string[] GetTheNames();
}

您的应用程序逻辑类如下所示:

public class ApplicationLogic {

     public IWcfInterface WcfInterface {get;set;}

     public SomeLogic() {
         WcfInterface.GetTheNames();
     } 
}

因此,如果您需要真正的实现,只需将其传递给应用程序逻辑的WcfInterface属性(通常这会执行依赖注入容器)。

虚假实施也很简单:

public FakeImplementation : IWcfInterface {
     public string[] GetTheNames() {
         return new string[] { "foo", "bar" };
     }
}

答案 1 :(得分:0)

如果我是对的,编译器会建议使用关键字new。

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

这个msdnpage将解释如何使用它。

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}