gpt4 book ai didi

c# - ASP.NET MVC + WIndsor + Log4Net 如何拦截模型?

转载 作者:行者123 更新时间:2023-11-30 12:15:29 26 4
gpt4 key购买 nike

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

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

这篇文章告诉我如何在不接触任何 Controller 的情况下为每个 Controller 的操作写日志该文章还指出我可以使用模型中的方法来做到这一点,但没有说明如何做。

你能帮帮我吗

最佳答案

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

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

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

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

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

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

关于c# - ASP.NET MVC + WIndsor + Log4Net 如何拦截模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7268051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com