【问题标题】:Using PostSharp OnExceptionAspect across mulit projects在多个项目中使用 PostSharp OnExceptionAspect
【发布时间】:2013-11-23 13:55:59
【问题描述】:

大家下午好,

我正在尝试使用 Reza Ahmadi 的示例“使用 C# 和 PostSharp 的面向方面编程” http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS 和 dnrTV http://dnrtv.com/dnrtvplayer/player.aspx?ShowNum=0190 用于异常处理。如果“OnExceptionAspect”在同一个项目/程序集中,一切都很好,但是如果我将类移动到它自己的 dll,则该事件不起作用。

[assembly: ExceptionAspect (AttributePriority = 1)]
[assembly: ExceptionAspect(AttributePriority = 2, AttributeExclude = true, AttributeTargetTypes = "HpsErp.Common.AspectObject.*")]
    namespace AspectObject
         [Serializable]
            public class ExceptionAspect : OnExceptionAspect
            {
                public override void OnException(MethodExecutionArgs args)
                {
                    Trace.TraceError("{0} in {1}.{2}",
                        args.Exception.GetType().Name,
                        args.Method.DeclaringType.FullName,
                        args.Method.Name);

                    if (args.Instance != null)
                    {
                       Trace.TraceInformation("this={0}", args.Instance); 
                    }

                    foreach (ParameterInfo parameter in args.Method.GetParameters())
                    {
                        Trace.TraceInformation("{0}={1}", parameter.Name,
                            args.Arguments[parameter.Position] ?? "null");
                    }
                }

我还在外部 dll 中为“Timing”创建了一个类,如果我向该类添加自定义属性,效果会很好。

namespace AspectObject
 [Serializable]
    [MulticastAttributeUsage(MulticastTargets.Method)]
    public class TimingAspect : OnMethodBoundaryAspect
    {
        [NonSerialized]
        Stopwatch _StopWatch;

        public override void OnEntry(MethodExecutionArgs args)
        {
            _StopWatch = Stopwatch.StartNew();

            base.OnEntry(args);
        }

        public override void OnExit(MethodExecutionArgs args)
        {
            Console.WriteLine(string.Format("[{0}] took {1}ms to execute",
                new StackTrace().GetFrame(1).GetMethod().Name,
                _StopWatch.ElapsedMilliseconds));

            base.OnExit(args);
        }


Using AspectObject;

namespace MyApp
{
    public class Car
    {
        [TimingAspect]
        private void Drive()
        {
            //...
        }
    }
}

最后,我希望这是多个 dll,以便我可以重用它,即:wcf。

感谢您的所有帮助...

詹姆斯

【问题讨论】:

    标签: aop postsharp


    【解决方案1】:

    如果它们存储在单独的 DLL 中,您可以访问它们。

    我总是创建一个名为 Aspects 的 DLL 类项目。在我想要 AOP 的项目中,我添加了对该 dll 类的引用。然后像往常一样装饰你的方法/类/程序集。

    https://github.com/sharpcrafters/PostSharp-Toolkits http://researchaholic.com/tag/postsharp/

    【讨论】:

    • Chadit,感谢您的帮助。我希望的一件事是,如果 OnExceptionAspect 与我尝试“尝试/捕获”的过程在同一个 dll 中,我不必添加 [OnExceptionAspect] 的自定义属性。有没有办法从另一个 dll 执行此操作,或者此功能只能在同一个 dll 中使用?再次感谢您对此的帮助......
    • 如果您想将它添加到 dll 中的所有方法中,您可以添加对您的 AssemblyInfo.cs 的引用。就像 CS 文件一样,您需要添加对包含您的方面的项目的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多