0

皆さん、こんにちは。

Reza Ahmadi 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 にクラスを作成しました。クラスにカスタム属性を追加すると、うまく機能します。

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.

助けてくれてありがとう...

ジェームズ

4

1 に答える 1

1

別の DLL に保存されている場合は、アスペクトにアクセスできます。

私はいつも Aspects という DLL クラス プロジェクトを作成します。AOP が必要なプロジェクトでは、その dll クラスへの参照を追加します。次に、通常どおりにメソッド/クラス/アセンブリを装飾します。

https://github.com/sharpcrafters/PostSharp-Toolkits <-- 良い例 http://researchaholic.com/tag/postsharp/ <-- いくつかの例、例をアップロードしました

于 2012-08-16T18:28:24.560 に答える