2010-10-20 2 views
3

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

public static TResult CallMethod<TChannel, TResult>(
    this ClientBase<TChannel> proxy, 
    Func<TResult> func) where TChannel : class 
{ 
    proxy.ThrowIfNull("proxy"); 
    func.ThrowIfNull("func"); 

    try 
    { 
     // set client credentials 
     return func(); 
    } 
    finally 
    { 
     if (proxy != null) 
     { 
      try 
      { 
       if (proxy.State != CommunicationState.Faulted) 
       { 
        proxy.Close(); 
       } 
       else 
       { 
        proxy.Abort(); 
       } 
      } 
      catch (CommunicationException) 
      { 
       proxy.Abort(); 
      } 
      catch (TimeoutException) 
      { 
       proxy.Abort(); 
      } 
      catch (Exception) 
      { 
       proxy.Abort(); 
       throw; 
      } 
     } 
    } 
} 

метод будет использоваться следующим образом:

public int CreateBusinessObject(BusinessObject item) 
{ 
    MyServiceClient proxy = new MyServiceClient(); 
    return proxy.CallMethod(() => proxy.CreateBusinessObject(item)); 
} 

Мой вопрос действительно ли это будет лучше как статический метод, который создает прокси-сервис? Я немного обеспокоен моей текущей реализацией. Должно ли построение прокси-сервера внутри try/catch? Мое настоящее понимание заключается в том, что если конструктор терпит неудачу, в любом случае все равно ничего не стоит.

ответ

2

Если конструктор не работает, весь объект находится в недопустимом состоянии. Вы не должны беспокоиться об утилизации в этом случае.

Хороший тест на это то, что будет происходить при выполнении следующих действий:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (new TestClass()) 
     { 
      Console.WriteLine("In using"); 
     } 
    } 

    class TestClass : IDisposable 
    { 
     public TestClass() 
     { 
      throw new Exception(); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("Disposed"); 
     } 
    } 
} 

Результатом является то, что никогда не Уничтожение получает достигнуто. Это то, что происходит, когда конструктор терпит неудачу.

+2

Хорошая точка. Я должен был попробовать попробовать что-то вроде этого. Благодарю. –

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