ASP.NET MVC + WIndsor + Log4Net如何拦截模型

本文关键字:何拦截 模型 Log4Net WIndsor NET MVC ASP | 更新日期: 2023-09-27 18:07:09

我已经学习了一个关于如何在ASP中使用Windsor和Log4Net作为AOP的优秀教程。净MVC

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

这篇文章向我展示了如何在不接触任何控制器的情况下为每个控制器的动作编写日志这篇文章还指出,我可以用模型中的方法做到这一点,但没有说明如何做。

你能帮我一下吗

ASP.NET MVC + WIndsor + Log4Net如何拦截模型

我是问题中链接的作者,所以首先感谢您的友好话语。现在回到你的问题:

在模型上使用拦截器是非常困难和/或不切实际的,因为要让拦截器工作,你应该只能通过Castle Container访问模型的实例。看到问题了吗?

假设你有一个叫做Book的模型对象,你想拦截对它的所有调用,你需要确保你从不使用像new Book()这样的东西,只通过Castle访问Book的实例。拦截器通过代理工作,当您自己创建对象的实例时将无法工作。这意味着能够有效地使用拦截器,你需要围绕它构建你的整个应用程序,我认为这可能不是最好的主意。即每次你想要一个Book的实例,你需要问城堡,而不是使用Container.Resolve<Book>()。我个人认为这种方法并不优雅。我认为它打破了良好的OO设计的封装和原则。

拦截控制器很容易做到,因为所有控制器只在一个地方初始化,ControllerFactory是我们钩入的地方。然而,模型对象可以用不同的方式初始化,因为它们确实应该描述你的领域模型。

可能有一些方法可以绕过这个问题。我能想到的第一个方法是使用一个ORM,比如NHibernate,它已经在后台使用了拦截器,你可以钩入各种事件,比如Save, Update,或者任何方法调用。限制是,拦截器只能对从数据库中检索到的模型工作。

另一个选择是使用编译时重写器,如Postsharp,它可以在编译后重写代码。通过这种方式,可以添加和删除对每个方法的开始和结束的额外调用。

您可以为您的模型编写与Log4Net拦截器完全相同的方式。

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