Внедрение зависимостей с прокси WCF - PullRequest
2 голосов
/ 22 ноября 2010

У меня есть служба (Service1), которая использует другую услугу (Service2). Я использую внедрение зависимостей для обеих служб и мне нужно внедрить прокси для Service2 в Service1.

Я не уверен, как справиться с тем фактом, что прокси-сервер - это не простой класс типа IService2, а прокси-сервер, наследующий также от ClientBase. Очевидно, что моя реализация Service1 должна открыть прокси-сервер и должна также закрыть его после использования или прервать его, если происходит исключение, но если я просто внедряю экземпляр IService2, то я не могу сделать это (без приведения), потому что методы Open, Close и Abort находятся в базовом классе, а мои операции в интерфейсе.

Когда дело доходит до тестирования Service1, я ожидал бы просто смоделировать интерфейс, но если реализация Service1 ожидает методы Open, Close и Abort, то это сложно. В прошлом я делал что-то подобное, но должен быть лучший способ!

var proxyBase = _service2 as ClientBase;

if (proxyBase != null)
{
  proxyBase.Open();
}

_service2.DoOperation("blah"); //the actual operation

if (proxyBase != null)
{
  proxyBase.Close();
}

// repeat for Abort in exception handler(s).

Что делают другие люди?

Спасибо

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Ваш интерфейс защищен от требований Wcf. Если бы вы не использовали wcf, у вас не было бы метода Open and Close. В идеальном мире интерфейс должен выглядеть так же, как если бы служба находилась в процессе.

Вы уже выбрали свой контейнер IoC? Если у вас нет, я бы рассмотрел Виндзор . Это позволит вам поддерживать чистый интерфейс и внедрить службу как объект в процессе или прокси-сервер wcf.

container = new WindsorContainer().AddFacility<WcfFacility>();

container.Register(Component
  .For<IClientService2>()
  .ActAs(DefaultClientModel)
  .On(WcfEndpoint.FromConfiguration("YourServiceNameInConfiguration")))
  .LifeStyle.Transient);

WcfFacility сделает все открытие и закрытие канала за вас.

3 голосов
/ 22 ноября 2010

Автоматически сгенерированный класс, который вы получаете для добавления ссылки на службу для службы WCF, реализован как частичный класс.Что я делаю, это создаю еще один частичный файл для этого класса и реализую интерфейс, который предоставляет эти методы, а затем использует этот интерфейс, где вы обычно используете интерфейс ClientBase или WCF

public partial class Service2 : IClientService2  
{}

Если IClientService2 имеет Abortи методы Close, соответствующие методам ClientBase, это все, что вам нужно.

public interface IClientService2 : IService2 // where IService2 is the WCF service interface
{
    void Abort();
    void Close();
}

Я предлагаю внедрить фабрику для создания служб WCF, а не сам прокси, поскольку при возникновении сбоя канал больше не может использоваться, и вам нужно будет создать новый прокси.

IClientService2 proxy = _service2Factory.Create();


proxy.Open();


proxy.DoOperation("blah"); //the actual operation


proxy.Close();
0 голосов
/ 14 декабря 2010

В итоге я использовал этот подход , который использует Castle Dynamic Proxy для перехвата вызовов и обработки особенностей WCF.Он работает очень хорошо и позволяет классу, в который вводится прокси, обрабатывать его как обычный класс / интерфейс.Затем этот класс полностью тестируется модулем путем насмешки над интерфейсом контракта на обслуживание.

...