2010-06-26 2 views
0

У меня возник вопрос по поводу использования интерфейсов при запуске неуправляемых ресурсов. Предположим, у меня есть веб-сервис и сгенерированный клиент WCF. Договор на оказание услуг выглядит следующим образом:Как выявить классы, которые реализуют интерфейсы и использовать неуправляемые ресурсы?

[ServiceContract] 
public interface ITestService 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

На стороне клиента я использую инъекции зависимостей и связать интерфейс ITestService к TestServiceClient (сгенерированный с svcutil). Однако, когда я создаю ITestService, и это действительно TestServiceClient, он должен быть правильно настроен, но клиенты об этом не знают. Как вы справляетесь с этой проблемой?

Я думал о создании классов прокси-сервера, как это:

class TestServiceClientProxy : ITestService 
{ 
    #region ITestService Members 

    public string GetData(int value) 
    { 
     var client = new TestServiceClient(); 
     bool success = false; 
     try 
     { 
      var result = client.GetData(value); 
      client.Close(); 
      success = true; 
      return result; 
     } 
     finally 
     { 
      if (!success) 
      { 
       client.Abort(); 
      } 
     } 
    } 

    #endregion 
} 

Однако, я не думаю, что генерация кода будет лучший способ пойти. Должен ли я использовать некоторую структуру AOP или DynamicProxy?

Заранее благодарим за помощь.

+0

Взгляните на этот ответ: http://stackoverflow.com/questions/3010820/dependency-injection-wcf/3011473#3011473 –

+0

Какая польза от привязки завода вместо интерфейса прокси? Вы имеете в виду, что с помощью фабрики вы можете поместить прокси-сервер в блок, верно? Моя проблема заключается в том, что прокси wcf не должны использоваться при использовании блоков: http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the-wcf-client-using-block-issue и я не могу заставить всех своих клиентов задуматься над написанием правильного кода. – empi

+0

Вы всегда можете украсить реальную реализацию оболочкой IDisposable, которая правильно закрывает клиента в методе Dispose. Это позволит вам использовать прокси-интерфейс в используемом блоке и безопасно закрыть его. –

ответ

0

Заявить, что ваш интерфейс реализует IDisposable, реализует Dispose() в конкретном классе, и поставщик DI будет утилизировать его должным образом. Если поставщик DI не делает этого, найдите новый.

[ServiceContract] 
public interface ITestService : IDisposable 
{ 
    [OperationContract] 
    string GetData(int value); 
} 
+0

@Josh Einstein: речь идет не о сервисах, а о клиентах. – empi

+0

@Jame Ide: добавление IDisposable к определению моего интерфейса заставляет пользователей моего сервиса помнить о его выпуске через контейнер DI. Более того, если я хочу создать служебный макет, мне нужно будет определить Dispose, что совершенно не нужно. – empi

+0

@empi, Моя ошибка, вы правы. Я интерпретировал вопрос как «рассеять» серверную часть службы посредством реализации клиента IDisposable. – Josh

Смежные вопросы