ব্যবসায়ের লজিক ত্রুটির জন্য আমরা কী করতে চাই (প্রয়োজনীয় যুক্তি ত্রুটি ইত্যাদি নয়) হ'ল এমন একক এনাম থাকা যা সমস্ত সম্ভাব্য ধরণের ত্রুটিগুলি সংজ্ঞায়িত করে:
/// <summary>
/// This enum is used to identify each business rule uniquely.
/// </summary>
public enum BusinessRuleId {
/// <summary>
/// Indicates that a valid body weight value of a patient is missing for dose calculation.
/// </summary>
[Display(Name = @"DoseCalculation_PatientBodyWeightMissing")]
PatientBodyWeightMissingForDoseCalculation = 1,
/// <summary>
/// Indicates that a valid body height value of a patient is missing for dose calculation.
/// </summary>
[Display(Name = @"DoseCalculation_PatientBodyHeightMissing")]
PatientBodyHeightMissingForDoseCalculation = 2,
// ...
}
[Display(Name = "...")]
বৈশিষ্ট্যাবলী রিসোর্স কী ত্রুটি বার্তা অনুবাদ করতে ব্যবহার করা ফাইল নির্ধারণ করুন।
এছাড়াও, এই ফাইলটি আপনার কোডটিতে একটি নির্দিষ্ট ধরণের ত্রুটি উত্পন্ন হওয়ার সমস্ত ঘটনা সন্ধানের জন্য একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করা যেতে পারে।
ব্যবসায়িক বিধিগুলি পরীক্ষা করা বিশেষায়িত ভ্যালিডেটর শ্রেণিতে নিযুক্ত করা যেতে পারে যা লঙ্ঘিত ব্যবসায়িক বিধিগুলির তালিকা সরবরাহ করে।
এরপরে লঙ্ঘিত নিয়মগুলি পরিবহনের জন্য আমরা একটি কাস্টম ব্যতিক্রমের প্রকারটি ব্যবহার করি:
[Serializable]
public class BusinessLogicException : Exception {
/// <summary>
/// The Business Rule that was violated.
/// </summary>
public BusinessRuleId ViolatedBusinessRule { get; set; }
/// <summary>
/// Optional: additional parameters to be used to during generation of the error message.
/// </summary>
public string[] MessageParameters { get; set; }
/// <summary>
/// This exception indicates that a Business Rule has been violated.
/// </summary>
public BusinessLogicException(BusinessRuleId violatedBusinessRule, params string[] messageParameters) {
ViolatedBusinessRule = violatedBusinessRule;
MessageParameters = messageParameters;
}
}
ব্যাকএন্ড পরিষেবা কলগুলি জেনেরিক ত্রুটি হ্যান্ডলিং কোডে মোড়ানো থাকে যা লঙ্ঘিত বুসিনস বিধিটিকে ব্যবহারকারীর পাঠযোগ্য ত্রুটি বার্তায় অনুবাদ করে:
public object TryExecuteServiceAction(Action a) {
try {
return a();
}
catch (BusinessLogicException bex) {
_logger.Error(GenerateErrorMessage(bex));
}
}
public string GenerateErrorMessage(BusinessLogicException bex) {
var translatedError = bex.ViolatedBusinessRule.ToTranslatedString();
if (bex.MessageParameters != null) {
translatedError = string.Format(translatedError, bex.MessageParameters);
}
return translatedError;
}
এখানে এটির ToTranslatedString()
জন্য একটি এক্সটেনশন পদ্ধতিটি বৈশিষ্ট্যগুলি enum
থেকে রিসোর্স কীগুলি পড়তে [Display]
এবং ResourceManager
এই কীগুলি অনুবাদ করতে ব্যবহার করতে পারেন। নিজ নিজ সম্পদ কী-এর জন্য মান জন্য প্লেসহোল্ডার ধারণ করতে পারে string.Format
, যা এটি মেলে MessageParameters
। রেজেক্স ফাইলটিতে প্রবেশের উদাহরণ:
<data name="DoseCalculation_PatientBodyWeightMissing" xml:space="preserve">
<value>The dose can not be calculated because the body weight observation for patient {0} is missing or not up to date.</value>
<comment>{0} ... Patient name</comment>
</data>
ব্যবহারের উদাহরণ:
throw new BusinessLogicException(BusinessRuleId.PatientBodyWeightMissingForDoseCalculation, patient.Name);
এই পদ্ধতির সাহায্যে, ত্রুটি প্রজন্মের থেকে ত্রুটি বার্তার প্রজন্মকে ডুপল করতে পারেন, প্রতিটি নতুন ধরণের ত্রুটির জন্য একটি নতুন ব্যতিক্রম শ্রেণি প্রবর্তন করার প্রয়োজন ছাড়াই। যদি বিভিন্ন সম্মুখভাগে বিভিন্ন বার্তা প্রদর্শিত হয় তবে প্রদর্শিত বার্তাটি যদি ব্যবহারকারীর ভাষা এবং / অথবা ভূমিকা ইত্যাদির উপর নির্ভর করে তবে দরকারী ful