Как я могу передать сообщения проверки сервисного уровня вызывающей стороне?

Я провел много исследований, в том числе здесь, на SO, и я не могу найти четкого направления. В настоящее время у меня есть приложение ASP.NET MVC3 с сервисным уровнем, который находится поверх репозитория.

На моем сервисном уровне у меня есть такие функции, как:

public class MyService{

    public void CreateDebitRequest(int userId, int cardId, decimal Amount,.... )
    {
    //perform some sort of validation on parameters, save to database
    }

    public void CreateCreditRequest(.....)
    }
        //perform some sort of validation on parameters, save to database
    }

    public void CreateBatchFile()
    {
        //construct a file using a semi-complex process which could fail
        //write the file to the server, which could fail
    }


    public PaymentTransaction ChargePaymentCard(int paymentCardId, decimal amount)
    {
        //validate customer is eligible for amount, call 3rd party payments api call,
        //...save to database, other potential failures, etc.
    }

}

Я видел, как люди говорят, что проверка параметров не является чем-то исключительным, и поэтому создание исключения не очень уместно. Мне также не нравится идея передачи выходного параметра, такого как строка, и проверка на наличие пустого значения. Я рассматривал возможность реализации класса ValidationDictionary и превращения его в свойство любого заданного класса службы (. посмотреть, как дела пошли). Я мог бы проверить статус ValidationDictionary после запуска любой заданной функции :

var svc = new MyService();
svc.CreateBatchFile();
if (svc.ValidationDictionary.IsValid)
    //proceed
else
   //display values from svc.ValidationDictionary.Messages...

. Что мне не нравится в этом, так это то, что мне придется обновлять его для каждого вызова функции сервисного уровня, чтобы он не сохранял старые значения (, если я решил не использовать его для многих или большинства функций, можно было бы ожидать, что он будет иметь значимое или нулевое значение после запуска любой данной функции). Еще я рассматривал возможность передачи ValidationDictionary для каждого вызова функции, которая может иметь подробную информацию о проверке, но затем я возвращаюсь к использованию параметра out...

Есть ли у кого-нибудь из вас рекомендации? Кажется, я не могу найти никакого чистого способа сделать это. Иногда достаточно информации, возвращающей значение null для функции, но иногда мне хотелось бы, чтобы вызывающая сторона передала немного больше информации для проверки. Любой совет будет принят во внимание!

Изменить для уточнения: Мой сервисный уровень не знает, что его использует приложение MVC. На сервисном уровне есть только определенные общедоступные функции, такие как CreateBatchFile()или AddDebitRequest(). Иногда потребителю достаточно возврата null, (в данном случае это контроллер, но может быть и что-то еще,)чтобы знать, что произошло, а иногда потребителю требуется дополнительная информация от сервисного уровня, (возможно, для передачи в ModelState, если потребитель является контроллером). Как мне поднять это из самого сервисного слоя?

9
задан Josh 11 April 2012 в 06:33
поделиться