Tôi đã thực hiện rất nhiều nghiên cứu, bao gồm cả ở đây trên SO, và tôi dường như không thể tìm thấy hướng rõ ràng. Tôi hiện đang có một ứng dụng ASP.NET MVC3, với một lớp dịch vụ nằm trên đầu trang của một kho lưu trữ.Tôi làm cách nào để chuyển các thông báo xác thực lớp dịch vụ cho người gọi?
Trong lớp dịch vụ của tôi, tôi có các chức năng như:
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.
}
}
tôi đã nhìn thấy người ta nói rằng xác nhận tham số không phải là rất đặc biệt, và do đó ném một ngoại lệ không phải là rất phù hợp. Tôi cũng không thích ý tưởng đi qua trong một paramater ra, chẳng hạn như một chuỗi, và kiểm tra cho một giá trị sản phẩm nào. Tôi đã xem xét việc triển khai lớp ValidationDictionary và biến nó thành thuộc tính của bất kỳ lớp dịch vụ nào (nó có chứa một boolean IsValid, và Danh sách các thông báo lỗi, và có thể được kiểm tra sau bất kỳ cuộc gọi hàm nào trong lớp dịch vụ để xem cách mọi thứ đã đi). Tôi có thể kiểm tra tình trạng ValidationDictionary sau khi chạy bất kỳ chức năng đưa ra:
var svc = new MyService();
svc.CreateBatchFile();
if (svc.ValidationDictionary.IsValid)
//proceed
else
//display values from svc.ValidationDictionary.Messages...
Điều tôi không thích về vấn đề này là tôi sẽ phải cập nhật nó cho mỗi lớp dịch vụ cuộc gọi chức năng, để tránh việc nó giữ lại giá trị cũ (nếu tôi chọn không sử dụng nó cho nhiều hoặc nhiều chức năng nhất, người ta vẫn mong đợi nó có một giá trị có ý nghĩa hoặc vô giá trị sau khi chạy bất kỳ hàm nào đã cho). Một điều tôi đã xem xét là đi qua trong ValidationDictionary cho mỗi cuộc gọi chức năng có thể có thông tin xác thực chi tiết, nhưng sau đó tôi trở lại để sử dụng một tham số ...
Bạn có đề xuất nào không? Tôi dường như không thể tìm ra cách làm sạch nào. Đôi khi trả về null cho một hàm là đủ thông tin, nhưng đôi khi tôi muốn có thêm một ít thông tin xác thực được truyền lại cho người gọi. Lời khuyên nào sẽ được đánh giá cao!
Chỉnh sửa để làm rõ: Lớp dịch vụ của tôi không biết rằng đó là ứng dụng MVC đang sử dụng nó. Tầng dịch vụ chỉ có một số chức năng công cộng nhất định như CreateBatchFile() hoặc AddDebitRequest(). Đôi khi trả về null là đủ cho người tiêu dùng (trong trường hợp này là bộ điều khiển, nhưng có thể là cái gì đó khác) để biết điều gì đã xảy ra, và đôi khi người tiêu dùng muốn thêm một số thông tin từ lớp dịch vụ (có thể chuyển sang ModelState nếu người tiêu dùng một bộ điều khiển). Làm cách nào để tôi tự động điều này lên từ chính lớp dịch vụ?
Hmmm ... Tôi nghĩ tôi đang nói về mức thấp hơn. Chúng tôi sẽ giả định rằng người dùng đã nhấn một nút và xác thực chế độ xem mô hình đã biến mất mà không gặp trục trặc. Bộ điều khiển của tôi sau đó sẽ gọi một hàm trong lớp dịch vụ và chức năng đó có thể thất bại vì nhiều lý do khác nhau (hoặc có thể xác thực viewmodel là rộng hơn dịch vụ thực sự yêu cầu, vì vậy khi dịch vụ xác thực các tham số cho chính nó, nó không thành công) . Làm thế nào tôi sẽ vượt qua thông tin này từ lớp dịch vụ sao lưu cho bộ điều khiển, để thậm chí có được đến điểm mà tôi có thể hiển thị với viewmodel hoặc modelstate? – Josh
Tôi đảm bảo rằng tất cả các logic xác nhận đều tồn tại trong viewmodel. Tại sao bạn muốn logic xác thực trải rộng khắp nơi? Xác thực đầu vào nằm trong mô-đun giao diện người dùng. Nếu một cái gì đó là sai trong lớp dịch vụ, bạn nên ném ngoại lệ, để cung cấp đăng nhập với các thông báo lỗi tốt hơn. Ứng dụng MVC của bạn sau đó có thể chuyển hướng đến các trang lỗi thân thiện dựa trên mã ngoại lệ/http. – Marcus
Giả sử tôi đang ở trong lớp dịch vụ và xác thực rằng ngày được chuyển vào CreateDebitRequest (...) không quá ba ngày trong tương lai. Có vẻ như tôi nên xác nhận điều này ở đây trong lớp dịch vụ, ngoài bất cứ nơi nào tôi xác nhận nó cao hơn trong chuỗi. Bạn có đồng ý với điều đó? Nếu vậy, sau đó bạn có nghĩ rằng tôi thực sự nên thực hiện xác nhận trong lớp dịch vụ của tôi, nhưng chỉ cần ném ngoại lệ khi xác nhận không thành công? Hoặc tôi có nên không được xác nhận ngày này trong lớp dịch vụ của tôi ở tất cả (tôi sẽ lo lắng về việc dựa vào người tiêu dùng dịch vụ)? Cảm ơn ... – Josh