Переопределить методы клиента WCF - PullRequest
1 голос
/ 22 сентября 2011

У меня есть служба 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 ]

1 голос
/ 22 сентября 2011

Ссылка на службу 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" };
     }
}
0 голосов
/ 22 сентября 2011

если я прав, компилятор предложит использовать ключевое слово 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() { }
}
...