Zrobiłem dużo badań, w tym tutaj na SO, i nie mogę znaleźć wyraźnego kierunku. Obecnie mam aplikację ASP.NET MVC3, z warstwą usługi, która znajduje się na szczycie repozytorium.W jaki sposób można przekazać wiadomości sprawdzania poprawności warstwy usługi do osoby dzwoniącej?
W moim warstwy usługowej, mam takie funkcje jak:
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.
}
}
Widziałem ludzie mówią, że walidacja parametr nie jest bardzo wyjątkowy i tak rzuca wyjątek nie jest bardzo przylegające. Nie podoba mi się też pomysł podania w out-out parametru, takiego jak ciąg znaków i sprawdzenia pustej wartości. Zastanawiam się nad zaimplementowaniem klasy ValidationDictionary i uczynieniem jej własnością dowolnej klasy usług (zawierałaby ona boolean IsValid oraz listę komunikatów o błędach i mogłaby zostać sprawdzona po dowolnym wywołaniu funkcji w warstwie serwisowej, aby zobaczyć, jak rzeczy poszły). Mogę sprawdzić status ValidationDictionary po uruchomieniu dowolną funkcję:
var svc = new MyService();
svc.CreateBatchFile();
if (svc.ValidationDictionary.IsValid)
//proceed
else
//display values from svc.ValidationDictionary.Messages...
Rzecz nie podoba mi o to, że będę musiał go zaktualizować do każdej warstwy usługa wywołania funkcji, aby uniknąć konieczności zachowa stare wartości (jeśli zdecydowałem się nie używać go dla wielu lub większości funkcji, można by się spodziewać, że po uruchomieniu jakiejkolwiek funkcji będzie mieć wartość znaczącą lub zerową). Kolejną rzeczą, którą rozważałem jest przekazywanie w ValidationDictionary dla każdego wywołania funkcji, które może zawierać szczegółowe informacje o sprawdzaniu poprawności, ale wracam do korzystania z parametru out ...
Czy któryś z was ma rekomendacje? Nie mogę wymyślić żadnego prostego sposobu robienia tego. Czasami zwracanie wartości null dla funkcji jest wystarczającą informacją, ale czasami potrzebuję trochę więcej informacji o sprawdzaniu poprawności przekazywanych do dzwoniącego. Każda rada byłaby doceniona!
Edit wyjaśnienie: warstwa Moje usługi nie jest świadoma, że jest to aplikacja MVC, że jest to czasochłonne. Warstwa usługi ma tylko pewne publiczne funkcje, takie jak CreateBatchFile() lub AddDebitRequest(). Czasami zwracanie wartości zerowej wystarcza konsumentowi (w tym przypadku kontrolerowi, ale może być czymś innym), aby wiedzieć, co się stało, a czasami konsument chciałby uzyskać więcej informacji z warstwy usługi (może przejść do ModelState, jeśli konsument jest kontroler). Jak mogę to spaprać z samej warstwy usługi?
Hmmm ... Myślę, że mówię o niższym poziomie. Zakładamy, że użytkownik nacisnął przycisk, a walidacja modelu widoku wyszła bez żadnych problemów. Mój kontroler wywoła funkcję w warstwie usługi, a ta funkcja może się nie powieść z różnych powodów (a może sprawdzanie poprawności widoku było bardziej hojne, niż wymaga tego usługa, więc gdy usługa sprawdza poprawność samych parametrów, to się nie powiedzie) . W jaki sposób przekazałbym te informacje z warstwy usługi z powrotem do kontrolera, aby przejść do punktu, w którym mogłem wyświetlać z viewmodel lub modelstate? – Josh
Upewniam się, że wszystkie logiki walidacji istnieją w viewmodel. Dlaczego chcesz, aby logika walidacji rozprzestrzeniała się w każdym miejscu? Walidacja wejścia należy do modułu interfejsu użytkownika. Jeśli coś jest nie tak w warstwie usługi, powinieneś rzucić wyjątek, aby zapewnić rejestrowanie z lepszymi komunikatami o błędach. Twoja aplikacja MVC może następnie przekierować na przyjazne strony błędów oparte na kodzie wyjątku/http. – Marcus
Załóżmy, że jestem w warstwie usługi i sprawdzam, czy data przekazana do CreateDebitRequest (...) nie będzie więcej niż trzy dni w przyszłości. Wygląda na to, że powinienem sprawdzać to tutaj w warstwie usługi, oprócz tego, gdzie sprawdziłem to wyżej w łańcuchu. Zgodziłbyś się z tym? Jeśli tak, to czy uważasz, że faktycznie powinienem przeprowadzać sprawdzanie poprawności w mojej warstwie usługi, ale po prostu zgłaszać wyjątki, gdy sprawdzanie poprawności nie powiedzie się? Czy nie powinienem w ogóle zatwierdzać tej daty w mojej warstwie serwisowej (byłbym zdenerwowany powołując się na konsumenta usług)? Dzięki ... – Josh