İş mantığı hataları için yapmak istediğimiz (gerekli olmayan argüman hataları vb.), Tüm olası hata türlerini tanımlayan tek bir numaraya sahip olmaktır:
/// <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 = "...")]Nitelikler kaynak anahtar hata iletileri çevirmek için kullanılacak dosyaları tanımlar.
Ayrıca, bu dosya, kodunuzda belirli bir hata türünün oluştuğu tüm oluşumları bulmak için bir başlangıç noktası olarak kullanılabilir.
İş Kurallarının kontrolü, ihlal edilen İş Kurallarının listelerini veren uzman Doğrulayıcı sınıflarına devredilebilir.
Ardından, ihlal edilen kuralları taşımak için özel bir İstisna türü kullanırız:
[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;
}
}
Arka uç servis çağrıları, ihlal edilen Busines Kuralını kullanıcı tarafından okunabilen bir hata mesajına dönüştüren genel hata işleme koduna sarılır:
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;
}
İşte ToTranslatedString()için bir uzantısı yöntemidir enumbundan kaynak anahtarlarını okuyabilir [Display]nitelikler ve kullanmak ResourceManagerbu anahtarları çevirmek. İlgili kaynak anahtarının değeri string.Format, sağlanan ile eşleşen yer tutucuları içerebilir MessageParameters. Resx dosyasındaki bir giriş örneği:
<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>
Örnek kullanım:
throw new BusinessLogicException(BusinessRuleId.PatientBodyWeightMissingForDoseCalculation, patient.Name);
Bu yaklaşımla, her yeni hata türü için yeni bir istisna sınıfı sunmaya gerek kalmadan hata mesajının oluşturulmasını hatanın oluşturulmasından ayırabilirsiniz. Görüntülenen mesajın kullanıcı diline ve / veya rolüne vb. Bağlı olması durumunda, farklı kullanıcı arabirimlerinin farklı mesajlar görüntülemesi gerekiyorsa kullanışlıdır.