- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含多个层的项目 - 其中包括 Web 前端 (ASP.NET MVC3) 和服务后端(主要是业务逻辑)。该项目已有几个月的历史,因此一切都按预期进行。现在,我正在尝试使用自定义 [Log]
属性向某些 MVC3 Controller 方法添加日志记录方面。
我正在使用 Castle Windsor用于依赖注入(inject)。为了获得日志记录方面,我利用 Castle DynamicProxy通过SNAP .正在使用 WindsorControllerFactory
解析 Controller 来自 Krzysztof Koźmic 的有用教程 - 但我对其进行了修改以查找 Controller 的默认界面(见下文)。
在我的服务层:
[Log(LoggingLevel.Info)]
public void Save(MyBusinessDto dto)
{
// business logic and other checks
this.repository.Save(mbo);
}
在我的网络前端的 IWindsorInstaller
对于 Controller :
private static BasedOnDescriptor FindControllers()
{
return AllTypes
.FromThisAssembly()
.BasedOn<IController>()
.WithService.DefaultInterface();
}
在我的(稍微自定义的)WindsorControllerFactory
中,它寻找 Controller 的默认接口(interface):
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format(Error404, requestContext.HttpContext.Request.Path));
}
string controllerName = controllerType.Name;
string defaultInterfaceName = 'I' + controllerName;
Type defaultInterface = controllerType.GetInterface(defaultInterfaceName);
object controller = this.kernel.Resolve(defaultInterface);
return (IController)controller;
}
在我的 Controller 中:
public class MyBusinessController : MyBusinessControllerBase, IMyBusinessController
{
[Log(LoggingLevel.Debug)]
public ActionResult CreateOrUpdate(MyBusinessFormModel fm)
{
// Convert form model to data transfer object,
// perform validation and other checks
this.service.Save(dto);
return View(fm);
}
}
这在服务项目中一切正常,但在 Controller 中,方法没有被拦截。
WindsorControllerFactory
返回代理 Controller 。MasterProxy
拦截了 Controller - 但它只拦截了 IController.Execute(RequestContext requestContext)
。我如何拦截所有具有我的[Log]
属性的 Controller 方法?
更新 1:我考虑过直接使用 DynamicProxy 而不是 SNAP,但这是次要的,因为它也适用于 Controller 。
更新 2+4:似乎 SNAP
从 github 中丢失
back on github .
更新 3:这是我在插入 WindsorControllerFactory
时在 Visual Studio 调试器中看到的(见上文)。检查的 controller
变量是返回给 MVC 的,它确实被代理了。
Controller
{CaSTLe.Proxies.IMyBusinessControllerProxy}
__interceptors
{CaSTLe.DynamicProxy.IInterceptor[1]}
[0]
{Snap.MasterProxy}__target
{My.Business.Web.Controllers.MyBusinessController}
服务
{CaSTLe.Proxies.IMyBusinessServiceProxy}MyInjectedProperty
{My.Business.Useful.MyOtherType}最佳答案
在 IController GetControllerInstance(...)
中,不提供接口(interface)代理,使用虚拟
方法提供类代理。
从 IController GetControllerInstance(...)
返回的 Controller 中用户实现的方法将不会通过代理的 IMyBusinessController
接口(interface)访问,而是从 转换IController
到 Controller 的实际类;例如 MyBusinessController
。请改用类代理,以使 MVC3 的转换返回代理。此外,将方法标记为 virtual
,否则拦截代理将无法拦截方法调用并检查自定义属性。
在 Controller 中,将 virtual
添加到具有属性的方法中:
public class MyBusinessController : MyBusinessControllerBase, IMyBusinessController
{
[Log(LoggingLevel.Debug)]
public virtual ActionResult CreateOrUpdate(MyBusinessFormModel fm)
{
// Convert form model to data transfer object,
// perform validation and other checks
this.service.Save(dto);
return View(fm);
}
}
为什么只有 Execute(...)
被拦截? IController
接口(interface)只包含 Execute(...)
。在返回的controller interface proxy上调用了execute,这样就可以拦截了。但是一旦 MVC3 的内部 ControllerBase.Execute(...)
得到调用,它就会执行转换到它期望来自 ControllerFactory
的类。
问题类似于this
leaking ,因为两者都绕过了接口(interface)代理。我想它可以通过多种方式解决;也许通过创建自定义类型转换器、从工厂中的接口(interface)代理目标创建类代理、巧妙的 Windsor 配置等。
Krzysztof Koźmic 的 IController installer和 WindsorControllerFactory
应该开箱即用。接口(interface)代理可能会在更大的画面中被推荐(并且在 Controller 中使用拦截器之前它们工作良好)但在这种情况下可能有理由不走那么远,以避免进一步的副作用。
感谢 Marius 为我指明了正确的方向!
关于c# - ASP.NET MVC3 Controller AOP 代理不拦截所有方法,只有 IController.Execute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8938715/
我有一个我想暂时存储的对象。该对象现在在 Controller 中, Controller 将生成一个 View 。 AJAX 请求从 View 发送到下一个 Controller 。那一刻我需要先前
从MVC 2开始,我们可以轻松创建区域。现在,我的问题与嵌套区域(区域内部的区域)有关。 选择我的“father”区域文件夹,右键单击> Add> NO选项以获取new Area。 是否有可能以其他方
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我已经尝试了一些谷歌搜索和堆栈流搜索,但事实证明这比我想象的要难找到。我需要为我们的商店迁移到 ASP.NET MVC 2 的管理提供理由。最大的帮助将是任何企业级站点或使用 ASP.NET MVC
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我有一些常见的网页,它们将出现在多个 MVC 应用程序中。对于这些页面,我想在不同的 MVC 网站之间重用相同的源代码( Controller + View )。这样做的最佳方法是什么? ASP.NE
我正在使用 Spring MVC 来构建我的应用程序。 当用户在浏览器中运行应用程序时,我想显示一个默认的 jsp。我不想用 web.xml 中的标记。 我想我可以用 我已经创建了一个文件夹并添
我可能在这里分析过度了,但是根据我对 MVC 的阅读,似乎有很多关于如何做事情的观点。 是否有一个“最佳实践”网站或文档来定义 MVC 各个部分的职责? 请记住,我使用 EF/Repository&U
当杰里米和查德 posted about their FubuMvc project ,他们提到的差异化因素之一是他们的“雷霆穹顶校长”: The “Thunderdome Principle” –
我正在为 Spring MVC 应用程序实现缓存清除系统。 为了让这个系统正常工作,我必须从给定的 url 中删除“缓存破坏代码”。假设我生成的缓存破坏代码是“123”,我有一个 .css url:/
在调试 ASP.NET MVC 源时,我发现使用了“MVC-ControllerTypeCache.xml” 文件。但我无法理解这个文件的用途。我的意思是这个文件存储在哪里?asp.net MVc 如
我刚刚在我的本地机器上安装了 Visual Studio 11 和 MVC 4 beta。但是,每当我打开一个 MVC 3 项目(我想保留为 MVC 3)时,所有引用都已更新为版本 4 DLL。当然它
我有一个 MVC 3 应用程序,它具有一些核心功能(最重要的是自动化),但主要用作不同区域或模块的门户。我想将它组织到不同的模块中,只需稍作更改也可以部署为他们自己的网站。 该项目由论坛、博客引擎、用
我有自己的服务器,正在考虑将我的一个解决方案升级到 ASP.NET MVC 4,然后再升级其余的 (3+)。 作为其中的一部分,我下载了 the standalone installer对于 ASP.
构图 我有一个 MVC 项目,其中包含 C# 类,这些类最终通过 ajax 等进行序列化和使用。我使用 TypeLite 生成这些 C# 类的定义( here 讨论了 TypeLite 的替代方案),
我正在尝试了解现代 Web 应用程序架构。在 ASP.NET MVC 中,所有业务逻辑类都在 Model 中,Controller 接受并引导用户请求。如果我使用它,是否可以使用本身是 MVC 架构但
我有一个带有 OWIN 的 WebAPI 2 应用程序。现在我正在尝试向所有内容添加一个 MVC 5 Controller ,但没有找到我的 MVC 路由。我收到以下错误: No HTTP resou
在 MVC 3 中,他们添加了我一直在使用的依赖解析器。在回答某人对您发表评论的问题时,您应该使用 Ninject MVC 3 插件。 所以我的问题是为什么要使用它而不是内置的?如果这是要走的路,你如
我是 ASP.NET MVC 的新手,我正在寻找最不痛苦的方法来设置全局错误处理、日志记录和报告(通过电子邮件)。仅供引用,我的 ASP.NET MVC 应用程序在 Azure 中作为 Web 角色托
何时使用 MVC View 页面和 MVC View 内容页面?它们有什么区别? 最佳答案 **MVC View Page 用于创建页面,MVC VewP Content Page 用于创建页面并指定
我是一名优秀的程序员,十分优秀!