В моем текущем проекте есть несколько компонентов / библиотек, которые разработаны как адаптеры.
Например, один адаптер инкапсулирует IO-доступ к файловой системе.
В реальной схеме обработки исключений адаптер должен выдавать определенные исключения, такие как FileSystemFileNotFoundException
.
Специфичные для адаптера исключения должны быть получены из базового исключения адаптера.
Основная причина в том, что у разработчика есть хороший способ отловить все исключения, связанные с конкретным адаптером.
Иногда базовые исключения предоставляют дополнительную информацию, в случае адаптера ввода-вывода исходный файл и свойство целевого файла, которое содержит полный путь и имя файла каждого файла.
Основное приложение имеет три собственных базовых исключения из трех разных сценариев.
Есть несколько адаптеров, которые вызываются из основного приложения.
Теперь каждому адаптеру нужна своя логика сопоставления исключений в основном приложении.
Сопоставление адаптера с типом исключения приложения, дополнительная работа с дополнительной информацией об исключении и т. Д.
Следующий код в настоящее время необходим для сопоставления источника с целевым исключением
var map = new Dictionary<Type, Type>()
{ typeof(FileAlreadyExistsTechnicalException) } };
var fileSystemAdapterException = ex as FileSystemAdapterBaseException;
if (fileSystemAdapterException != null)
{
var exception = from mapping in map
where mapping.Key.Equals(fileSystemAdapterException.GetType())
select mapping.Value;
var baseTechnicalException = (TechnicalException)Activator.CreateInstance(exception.Single());
baseTechnicalException.AddPlaceholderEntry(ExceptionPlaceholderConstants.File, fileSystemAdapterException.SourceFile);
resultException = baseTechnicalException;
}
return resultException;
1.) Это хороший дизайн?
2.) Как можно обобщить это отображение?
Сначала я подумал о AutoMapper , но может ли он дать мне возможность поработать над дополнительной информацией?