ASP.NET MVC + WIndsor + Log4Net как перехватить модели? - PullRequest
4 голосов
/ 01 сентября 2011

Я следовал прекрасному учебнику о том, как использовать Windsor и Log4Net в качестве AOP в ASP.NET MVC

http://cangencer.wordpress.com/2011/06/02/asp-net-mvc-3-aspect-oriented-programming-with-castle-interceptors/

В статье показано, как записывать журнал для каждого действия контроллеране касаясь каких-либо контроллеров В статье также утверждается, что я могу делать это с помощью методов в моделях, но не сказал, как это сделать.

Можете ли вы помочь мне

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Я автор ссылки в вопросе, поэтому сначала спасибо за добрые слова.Теперь на ваш вопрос:

Гораздо сложнее и / или нецелесообразно использовать перехватчики на ваших моделях, потому что для работы перехватчиков вы должны только получать доступ к экземплярам ваших моделей черезКонтейнер замка.Видите проблему?

Допустим, у вас есть объект модели с именем Book, и вы хотите перехватить все вызовы на нем, вам нужно убедиться, что вы никогда не используете что-то вроде new Book() и только доступ к экземплярам Book через Замок.Перехватчики работают через прокси и не работают, когда вы сами создаете экземпляры объектов.Это означает, что для эффективного использования перехватчиков вам потребуется структурировать все приложение вокруг этого, что, я думаю, не самая лучшая идея.то есть каждый раз, когда вам нужен экземпляр Book, вам нужно попросить Castle об этом вместо этого, используя Container.Resolve<Book>().Лично я не считаю этот подход очень элегантным.Я думаю, что это нарушает инкапсуляцию и принципы хорошего OO-дизайна.

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

Однако может быть несколько способов обойти это.Первое, о чем я могу подумать, это использовать ORM, такой как NHibernate, который уже использует перехватчики в фоновом режиме, к которым вы можете подключиться для различных событий, таких как Save, Update или любой из вызовов методов.Ограничение будет заключаться в том, что перехватчики будут работать только на моделях, извлеченных из базы данных.

Другой вариант - использовать программу перезаписи времени компиляции, например Postsharp , которая даст вам возможность переписать кодпосле компиляции.Таким образом, можно добавлять и удалять дополнительные вызовы в начале и конце каждого метода, который вы помечаете определенными атрибутами.

1 голос
/ 01 сентября 2011

Вы можете написать перехватчики для вашей модели точно так же, как это делается в перехватчике Log4Net. Используйте в качестве аргумента ctor только контракт вашей модели.

public ControllerModelInterceptor(IModel model)
{
  this.model = model;
}
...