【问题标题】:ASP.NET MVC + WIndsor + Log4Net how to intercept models?ASP.NET MVC + WINdsor + Log4Net 如何拦截模型?
【发布时间】:2011-09-01 08:54:35
【问题描述】:

我有一个关于如何在 ASP.NET MVC 中使用 Windsor 和 Log4Net 作为 AOP 的优秀教程

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

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

你能帮帮我吗

【问题讨论】:

  • 为什么要拦截MVC模型?恕我直言,这是一种代码味道......

标签: c# model-view-controller castle-windsor log4net aop


【解决方案1】:

我是问题中链接的作者,所以首先感谢您的客气话。现在回答你的问题:

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

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

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

不过,可能有几种方法可以解决这个问题。我能想到的第一个是使用诸如 NHibernate 之类的 ORM,它已经在后台使用了拦截器,您可以将这些拦截器用于各种事件,例如保存、更新或任何方法调用。限制是拦截器只能处理从数据库中检索到的模型。

另一种选择是使用编译时重写器,例如Postsharp,这将为您提供在编译后重写代码的方法。通过这种方式,您可以在使用特定属性标记的每个方法的开头和结尾添加和删除额外的调用。

【讨论】:

  • 其实我要拦截的不是Model,我是要记录SQL Statement的执行。我从不使用 NHibernate,从你的回答来看,我认为是时候尝试一下了。但我仍然不确定是否可以将 NHibernate 连接到 Windsor 以写入日志。我可能会再来问。非常感谢。
  • @hormkralob,nhib 在这种情况下应该非常适合您,因为您可以很容易地记录每个执行的 sql 语句。将 NHibernate 挂接到 Castle 也很容易。
【解决方案2】:

您可以按照与 Log4Net 拦截器完全相同的方式为您的模型编写拦截器。 仅将模型的合同用作 ctor 参数。

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

【讨论】:

  • 谢谢,您的回答听起来不错,但我对这个框架太陌生,无法完全理解它。
猜你喜欢
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2010-09-10
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多