2014-10-10 3 views
5

У меня есть приложение ASP.NET MVC, для которого я хочу регистрировать события. У меня уже есть класс журнала со всеми необходимыми инструментами, но мне нужно создать экземпляр и закрыть его явно (потому что он открывает файлы, поэтому я не могу зависеть от GC). Мои действия будут выглядеть следующим образом:Выполнение кода до/после каждого действия контроллера

public ActionResult MainMenu() 
{ 
    CreateLog(); 

    // Do controller stuff 
    Log(message); 
    // Do more controller stuff 

    CloseLog(); 
    return View(mModel); 
} 

Или я мог бы использовать using блок, но это будет лишь немного менее навязчивым И это создало бы проблемы с обработкой исключений. Я читал о ActionFilters, который мог бы использовать для создания и закрытия моего журнала, но тогда у меня не было бы доступа к объекту журнала внутри метода.

Есть ли у вас какие-либо предложения? Как я мог избежать повторения кода?

+0

Возможный дубликат [Выполнить метод в каждом запросе в MVC, C#?] (Https://stackoverflow.com/questions/9511462/run-a-method-in-each-request-in-mvc -c) – Liam

ответ

13

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

// Custom controller. 
public class CustomController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Do whatever here... 
    } 
} 

// Home controller. 
public class HomeController : CustomController 
{ 
    // Action methods here... 
} 
+0

Спасибо! Это именно то, что я искал! – Simone

2

Я бы рекомендовал вам вставить объект Logger (возможно, ILogger) в качестве зависимости от вашего контроллера. Вы можете контролировать время жизни этого объекта регистрации с помощью контейнера DI (например, Unity) - и, если необходимо, вы можете определить его время жизни как область запроса. Другое преимущество этого правила заключается в том, что ваш код останется под контролем.

+0

Очень хорошо, но как бы я пошел на вход в методы, которые не являются членами контроллера? – Simone

+0

Вы можете просто передать свой объект logger любым другим методам, чтобы они также могли его использовать. В качестве альтернативы, если он лучше подходит для ваших нужд, вы можете реализовать свой регистратор (или просто обернуть уже существующую реализацию регистратора) в качестве [Окружающего контекста] (http://blogs.msdn.com/b/ploeh/archive/2007/07/23 /ambientcontext.aspx). – aberkes

+0

Мне нравится решение Ambient Context (в то время как я предпочел бы не пропускать Log, так как я бы предпочел, чтобы мой метод не знал так много о сквозной проблеме). Однако как насчет безопасности потоков? Мне нужно закрыть открытые файлы журналов, поэтому каждый раз (в конце запроса) я должен закрыть журнал. У меня не может быть синглтон (или квази-синглтон), иначе он будет существовать через запросы. Несколько журналов попытаются открыть один и тот же файл, не пройдя (и проиграв события); один журнал может закрыть файл, в то время как другое запрошенное действие все еще имеет материал для регистрации. – Simone

0

вы можете использовать модули, потому что они оба сидят в конвейере и могут обеспечивать предварительную и пост-обработку для основного выполнения запроса. BeginRequest/ActionExecuting и EndRequest/ResultExecuted. Оба они также предоставляют авторизационные крючки.

http://msdn.microsoft.com/en-us/library/aa719858(v=vs.71).aspx

Смежные вопросы