В приложении, над которым я работаю, я создал легкий регистратор, который имеет две цели.Ошибки, зарегистрированные с помощью перечисления «Домен», будут записаны в базу данных, а ошибки, зарегистрированные с помощью перечисления «Приложение», могут быть извлечены из службы для отображения пользователю.
Я использую ninject InRequestScope дляразрешить сохранение сбора ошибок в рамках запроса.
Одна проблема, в которой я не уверен, - когда мне следует вызывать функцию для регистрации ошибок в базе данных.Эта функция помещает все ошибки в БД с помощью транзакции.У меня была идея сделать так, чтобы регистратор ошибок использовал IDisposable, а затем вызвал метод LogErrorsToDatabase () из метода Dispose.
Есть ли какие-либо проблемы с этим?
Будет ли автоматический вызов вызова утилизироватьили мне нужно настроить его для этого?
Сначала я попытался внедрить службу в Global.asax, но это вызвало непредвиденные проблемы.
РЕДАКТИРОВАТЬ: Я нашел способ сделать это более элегантно, поэтому для дальнейшего использования я опишу его ниже.
Сначала я создал фильтр настраиваемых действий и использовал внедрение свойства для внедрения службы IErrorLog:
public class LogErrorsAttribute : ActionFilterAttribute
{
[Inject]
public IErrorQueue ErrorQueue { private get; set; }
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
ErrorQueue.CommitDatabaseLog();
base.OnResultExecuted(filterContext);
}
}
Затем я использовал метод BindFilter Ninject, чтобы связать эту функцию с каждым вызываемым действием:
BindFilter<LogErrorsAttribute>(FilterScope.Last, 0);
Теперь все работает идеально и чисто.
Окончательное редактирование: я заметил, что кто-то проголосовал противнедавно, чтобы они могли использовать решение, которое я нашел.Я обнаружил ошибку с решением в последнем редактировании.Похоже, что мой навигационный контроллер запустил эту функцию, в тот момент, когда навигация сработала, ошибок не было, это записало в filtercontext и остановило его работу при вызове последующим действием вниз по цепочке.Чтобы решить эту проблему, я использовал следующий код привязки:
kernel.BindFilter<LogErrorsAttribute>(FilterScope.Last, 0).When(
(context, ad) => !string.IsNullOrEmpty(ad.ActionName) && ad.ControllerDescriptor.ControllerName.ToLower() != "navigation");
Это предотвращает запуск фильтра по любому коду навигации (частичные представления отображаются с контроллера.)