1

我们正在研究使用 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.

在这一点上,我被困住了。任何提示、指示或帮助将不胜感激。

4

2 回答 2

0

老实说,这是一个我没想到的用例。我今天将设置一个测试项目,看看我能想出什么。忍受我!

更新

我一直在玩后端代码(您可以从http://aspectmap.codeplex.com获得完整的代码副本),相关部分如下:

public T AddAspectsTo<T>(T concreteObject)
    {
        ProxyGenerator dynamicProxy = new ProxyGenerator();

        return (T)dynamicProxy.CreateInterfaceProxyWithTargetInterface(typeof(T), concreteObject,
            new[] { (IInterceptor)new AspectInterceptor(attributeMap) });
    }

这是使用城堡动态代理的东西。不幸的是 CreateInterfaceProxy... 方法需要传入一个接口(而不是像我希望的那样的基类)。现在我发现了这个问题: C# Dynamic Proxy 2 generate proxy from class with code in constructor ? 如何?

这似乎表明可以使用 CreateClassProxy。我还没有机会尝试这个,我要离开电脑一周。如果您想尝试将其连接起来,尽管欢迎您从 codeplex 获取源代码并尝试一下。如果没有,我会在我回来的时候把一些东西放在一起。

于 2012-10-22T08:03:09.817 回答
-1

动作过滤器可用于提供此类 AOP 功能。

http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

http://msdn.microsoft.com/en-us/library/dd410056%28v=vs.90%29.aspx

于 2012-08-08T20:28:37.900 回答