【问题标题】:Can you apply aspects in PostSharp without using attributes?您可以在不使用属性的情况下在 PostSharp 中应用方面吗?
【发布时间】:2011-12-09 09:53:21
【问题描述】:

我知道使用 Castle Windsor,您可以使用代码注册方面(在 Windsor 中使用方法拦截作为 AOP 时),而不是将属性应用于类。在 Postsharp 中是否有同样的可能?这是一种偏好,但更喜欢将方面与接口/对象匹配在一个地方,而不是全部属性。

更新: 好奇我是否可以将方面分配给与此类似的接口/对象:

container.Register(
        Component
        .For<IService>()
        .ImplementedBy<Service>()
        .Interceptors(InterceptorReference.ForType<LoggingAspect>()).Anywhere
   );

如果您可以这样做,您可以选择不必在程序集/类/方法上放置属性来应用方面。然后我可以拥有一个代码文件/类,其中包含哪些方面应用于哪些类/方法/等。

【问题讨论】:

    标签: aop postsharp


    【解决方案1】:

    应该可以使用PostSharp XML configuration。 XML 配置是项目加载器中插件和项目模型的统一。

    .psproj 的描述可以在http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx 找到。

    请注意,我只看到了 PostSharp Toolkits 如何使用此 XML 配置的示例。 但它应该同样适用于自定义方面。

    警告:我注意到从 Nuget 安装 PostSharp Toolkit 会覆盖现有的 psproj 文件。所以不要忘记备份它。

    【讨论】:

      【解决方案2】:

      看看 LOOM.NET,那里有一个后编译器和一个运行时编织器。使用后者,您可以准确地归档您想要的内容。

      【讨论】:

        【解决方案3】:

        是的。您可以使用多播(http://www.sharpcrafters.com/blog/post/Day-2-Applying-Aspects-with-Multicasting-Part-1.aspx,http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx)或者您可以使用方面提供者(http ://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1.aspx,http://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-13-e28093-Aspect-Providers-e28093-Part-2.aspx)。

        例子:

            using System;
            using PostSharp.Aspects;
            using PostSharp.Extensibility;
        
            [assembly: PostSharpInterfaceTest.MyAspect(AttributeTargetTypes = "PostSharpInterfaceTest.Interface1", AttributeInheritance = MulticastInheritance.Multicast)]
        
            namespace PostSharpInterfaceTest
        {
            class Program
            {
                static void Main(string[] args)
                {
                    Example e = new Example();
                    Example2 e2 = new Example2();
                    e.DoSomething();
                    e2.DoSomething();
                    Console.ReadKey();
                }
            }
        
            class Example : Interface1
            {
        
                public void DoSomething()
                {
                    Console.WriteLine("Doing something");
                }
            }
        
            class Example2 : Interface1
            {
        
                public void DoSomething()
                {
                    Console.WriteLine("Doing something else");
                }
            }
        
            interface Interface1
            {
                void DoSomething();
            }
        
            [Serializable]
            class MyAspect : OnMethodBoundaryAspect
            {
                public override void OnEntry(MethodExecutionArgs args)
                {
                    Console.WriteLine("Entered " + args.Method.Name);
                }
            }
        }
        

        如果您对确定哪些类型获得某些方面有复杂的要求,我建议您考虑创建一个方面提供程序。

        【讨论】:

        • 这些文章似乎仍然将属性应用于类。我一直在研究 Castle 如何进行动态注入:blog.andreloker.de/post/2009/02/20/…。我只是好奇你是否可以用 PostSharp 做到这一点。由于 PostSharp 将它们的方面编织为编译时间,因此可以理解是否没有。
        • 您希望实现什么目标?您的问题指出“这是一种偏好,但更喜欢将方面与接口/对象匹配在一个地方,而不是全部属性。”这就是为什么我给出了我所做的答案。现在听起来您想在运行时启用或禁用方面。如果使用属性应用方面有什么关系?您是否担心运行时与编译时间?
        • 我的回答还是一样。我已经更新给你一个做什么的例子。
        • @Bless 没有用于应用 aspcets 的 fuent 接口,但您当然可以很容易地自己构建一个,然后使用方面提供程序,您可以根据配置的内容应用方面。您可以将所有多播声明保存在单个文件中,例如“AspectApplication.cs”
        • 好的。我想我需要读一下你的系列。感谢您的耐心等待。
        猜你喜欢
        • 2018-09-16
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 2013-12-31
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多