При использовании Ninject2 InRequestScope можно утилизировать для очистки? - PullRequest
3 голосов
/ 08 декабря 2011

В приложении, над которым я работаю, я создал легкий регистратор, который имеет две цели.Ошибки, зарегистрированные с помощью перечисления «Домен», будут записаны в базу данных, а ошибки, зарегистрированные с помощью перечисления «Приложение», могут быть извлечены из службы для отображения пользователю.

Я использую 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");

Это предотвращает запуск фильтра по любому коду навигации (частичные представления отображаются с контроллера.)

1 Ответ

4 голосов
/ 08 декабря 2011

Да Ninject будет располагать объекты в области запроса.

...