private static void InitInternal()
        {
            try
            {
                if (_validationResult == null)
                {
                    _validationResult = new List <ValidationResult>();
                }

                var section = ConfigurationSectionBase.GetSection <ExceptionNotificationSettingsSection>("exceptionNotificationSettingsSection");

                if (section == null)
                {
                    return;
                }

                _emailMessage = new EmailMessage();

                _settings = new Dictionary <string, ExceptionNotificationSettings>();


                var types = ReflectionHelper.GetAllTypes(t => typeof(Exception).IsAssignableFrom(t))
                            .Distinct(new TypeComparer());

                PopulateEmaiMessage(section.EmailConfiguration);

                var timer = new Stopwatch();

                //ToDo: review
                //LoggerManager.WriteInformationToEventLog("Loading all exceptions...");

                timer.Start();

                var dict = types.ToDictionary(k => k.FullName);

                timer.Stop();
                //ToDo: review
                //LoggerManager.WriteInformationToEventLog(string.Format("Loading all exceptions took {0}", timer.Elapsed));


                foreach (ExceptionNotificationSettingsConfigurationElement setting in section.ExceptionNotificationSettings)
                {
                    if (!dict.ContainsKey(setting.Name) || _settings.ContainsKey(setting.Name))
                    {
                        continue;
                    }

                    double minutes;

                    if (!ReflectionHelper.TryParseOrDefault <double>(setting.TimeSpan, out minutes))
                    {
                        _validationResult.Add(new ValidationResult(string.Format("Configuration setting TimeSpan for {0} is not numerical. Value is {1}.", setting.Name, setting.TimeSpan)));
                        //ToDo: review
                        //LoggerManager.WriteWarningToEventLog(string.Format("Configuration setting TimeSpan for {0} is not numerical. Value is {1}.", setting.Name, setting.TimeSpan));

                        continue;
                    }

                    var newSettings = new ExceptionNotificationSettings
                    {
                        NotificationEntryType = dict[setting.Name],
                        TimeSpan = TimeSpan.FromMinutes(minutes),
                        To       = setting.OverrideRecipients.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    };

                    if (!IsSettingsValid(newSettings, _validationResult))
                    {
                        continue;
                    }

                    _settings[setting.Name] = newSettings;
                }
            }
            catch (Exception ex)
            {
                _error = ex;
                //ToDo: review
                //LoggerManager.WriteExceptionToEventLog(ex);
            }
            finally
            {
                _isValid = _error == null && _validationResult.Count == 0;
            }
        }
 private static bool IsSettingsValid(ExceptionNotificationSettings settings, IList <ValidationResult> validationResult)
 {
     return(Validator.TryValidateObject(settings, new ValidationContext(settings, null), validationResult));
 }