我们正在研究使用 AOP 框架来处理诸如日志记录、跟踪和异常处理之类的事情。我已经使用 PostSharp 构建了一个原型,现在我正在尝试使用 AspectMap 构建相同的功能。
简而言之,我有一个 ASP.NET MVC 3 应用程序,我想要一个可以轻松附加到我的控制器方法的方面,它显示入口、出口、执行时间和参数值。我的 PoC 是基本的 MVC 3 Internet 应用程序模板(文件 > 新建 > 项目 > Web > ASP.NET MVC 3 Web 应用程序 > Internet)。到目前为止我所做的...
创建了一个 AspectsRegistry
public class PoCRegistry : AspectsRegistry
{
public PoCRegistry()
{
ForAspect<ProfileAttribute>().HandleWith<ProfileHandler>();
}
}
创建了一个 StructureMapControllerFactory
public class StuctureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance( RequestContext requestContext, Type controllerType )
{
if( controllerType == null ) return null;
try
{
return ObjectFactory.GetInstance( controllerType ) as Controller;
}
catch( StructureMapException )
{
Debug.WriteLine( ObjectFactory.WhatDoIHave() );
throw;
}
}
}
在 Application_Start 中注册所有内容
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters( GlobalFilters.Filters );
RegisterRoutes( RouteTable.Routes );
ObjectFactory.Initialize( ie => ie.AddRegistry( new PoCRegistry() ) );
ControllerBuilder.Current.SetControllerFactory( new StuctureMapControllerFactory() );
}
此时应用程序工作正常,我可以看到它正在使用我的 StructureMapControllerFactory 来构建控制器(调试器进入该代码)。问题是我无法弄清楚在哪里或如何“丰富”生成的控制器。在教程中它说我需要使用类似以下的东西:
For<ICaseController>()
.Use<CaseController>()
.EnrichWith( AddAspectsTo<CaseController> );
但是在 AspectRegistry 中的教程中,在这种情况下这似乎不是正确的位置,因为注册表不负责解析控制器请求,控制器工厂负责。不幸的是,控制器工厂中的 GetInstance() 方法返回一个object
,而 EnrichWith() 方法需要一个SmartInstance
.
在这一点上,我被困住了。任何提示、指示或帮助将不胜感激。