Обработка исключений с помощью Enterprise Library 5.0 - PullRequest
0 голосов
/ 02 мая 2011

Сначала я объясню структуру моего проекта:

У меня есть WCF-сервис

public class MyService : IMyService
{
    private QueryHandler _queryHandler;

    public MyService()
    {
        _queryHandler = new QueryHandler();
    }

    public MyObject GetMyObject(string param1, string param2)
    {
        return _queryHandler.GetMyObject(param1, param2);
    }
}

Класс QueryHandler находится в другом проекте и является местом, где язапросить мою базу данных.

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

try
{
    //Do something
}
catch (Exception ex)
{
    ExceptionManager exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
    Exception exceptionToThrow;
    bool rethrow = exManager.HandleException(ex, "Exceptions Policy", out exceptionToThrow);

    if (rethrow)
    {
        if (exceptionToThrow == null)
        {
            throw;
        }
        else
        {
            throw exceptionToThrow;
        }
    }
    return null;
}

или я могу поместить его в свой класс веб-сервиса, например:

    public MyObject GetMyObject(string param1, string param2)
    {
        var exceptionManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
        return exceptionManager.Process(() => _queryHandler.GetMyObject(param1, param2), "Exceptions Policy"); 
    }

1 Ответ

2 голосов
/ 02 мая 2011

Поскольку вы упомянули WCF, вы можете использовать встроенный атрибут [ExceptionShielding] для обработки исключений в вашем сервисе.

В итоге вы получите что-то вроде этого:

[ServiceContract]
public interface IMyService
{
  [OperationContract]
  [FaultContract(typeof(FaultContracts.GetMyObjectFault))]
  MyObject GetMyObject(string param1, string param2);
}

[ExceptionShielding("GetMyObjectServicePolicy")]
public class MyService : IMyService
{
    private QueryHandler _queryHandler;

    public MyService()
    {
        _queryHandler = new QueryHandler();
    }

    public MyObject GetMyObject(string param1, string param2)
    {
        return _queryHandler.GetMyObject(param1, param2);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...