2012-08-15 11 views
0

大家中午好,使用PostSharp OnExceptionAspect整個項目的多功能使用

我想通過禮艾哈邁迪 http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS和dnrTV http://dnrtv.com/dnrtvplayer/player.aspx?ShowNum=0190使用例如「面向方面的編程使用C#和PostSharp」的異常處理。如果「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。

感謝您的任何和所有幫助...

詹姆斯

回答

1

您可以訪問方面,如果它們被存儲在一個單獨的DLL。

我總是創建一個名爲Aspects的DLL類項目。在我想要AOP的項目中,我添加了對該dll類的引用。然後像通常一樣裝飾你的方法/類/組件。

https://github.com/sharpcrafters/PostSharp-Toolkits < - 很好的例子 http://researchaholic.com/tag/postsharp/ < - 一些例子,剛剛上傳的例子

+0

Chadit,非常感謝您對這個幫助。我希望的一件事是,如果OnExceptionAspect與我嘗試「嘗試/捕獲」的過程位於相同的dll中,那麼我不必添加[OnExceptionAspect]的自定義屬性。有沒有辦法做到這一點從另一個DLL或該功能只能從相同的DLL內可用?再次感謝您對此的幫助.... – user1228551 2012-08-21 14:13:20

+1

如果您想將其添加到dll中的所有方法中,您可以添加對AssemblyInfo.cs的引用。就像CS文件一樣,您將需要添加對保存方面的項目的引用。 – Chadit 2012-08-21 18:15:44