2011-10-17 19 views
5

मुझे कैसल विंडसर के साथ पता है, आप कक्षाओं में विशेषताओं को लागू करने के बजाय कोड का उपयोग करके पहलुओं (विंडसर में एओपी के रूप में विधि इंटरसेप्शन का उपयोग करते समय) पंजीकरण कर सकते हैं। Postsharp में भी वही संभव है? यह एक वरीयता चीजें है, लेकिन एक ही स्थान पर इंटरफेस/ऑब्जेक्ट्स से मेल खाने वाले पहलुओं को पसंद करते हैं, क्योंकि सभी के गुणों के विपरीत।क्या आप विशेषताओं का उपयोग किये बिना पोस्टशर्प में पहलुओं को लागू कर सकते हैं?

अद्यतन: जिज्ञासु अगर मैं इंटरफेस के पहलुओं असाइन कर सकते हैं/वस्तुओं इस के समान:

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

आप ऐसा कर सकता है, तो आप नहीं विधानसभाओं पर विशेषताओं जगह करने का विकल्प होता है/पहलुओं को लागू करने के लिए कक्षा/विधियां। इसके बाद मैं एक कोड फ़ाइल/कक्षा रख सकता हूं जिसमें कौन से पहलू लागू होते हैं, किस वर्ग/विधियों/आदि पर।

उत्तर

3

हां। आप या तो मल्टीकास्टिंग (http://www.sharpcrafters.com/blog/post/Day-2-Aplplying-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- प्रिंसिपल- डेय-12-e28093- दृष्टिकोण- प्रदाता-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); 
     } 
    } 
} 

मेरा सुझाव है कि आप जो प्रकार कुछ पहलुओं है कि आप एक पहलू प्रदाता बजाय बनाने पर विचार मिलता है निर्धारित करने के लिए जटिल आवश्यकताओं है।

+0

ये लेख अभी भी कक्षा में एक विशेषता लागू करने लगते हैं। मैं कैसे कैसल करता है गतिशील इंजेक्शन की लाइनों के साथ देख रहा था: http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx। अगर आप PostSharp के साथ ऐसा कर सकते हैं तो मैं उत्सुक हूं। चूंकि पोस्टशर्प संकलित समय के रूप में अपने पहलुओं को बुझाता है, अगर यह नहीं समझ सकता है। –

+0

आप क्या हासिल करने के लिए देख रहे हैं? आपका प्रश्न बताता है "यह एक वरीयता चीजें है, लेकिन एक ही स्थान पर इंटरफेस/ऑब्जेक्ट्स से मेल खाने वाले पहलुओं को पसंद करते हैं, क्योंकि सभी के गुणों के विपरीत।" यही कारण है कि मैंने जवाब दिए जो मैंने किया था। अब ऐसा लगता है जैसे आप रनटाइम पर पहलुओं को सक्षम या अक्षम करना चाहते हैं। गुणों का उपयोग करके पहलुओं को लागू करने पर क्या मायने रखता है? क्या आपको रनटाइम बनाम संकलन समय के साथ चिंता है? –

+0

अद्यतन प्रश्न। मुझे बताएं कि क्या चीजों को साफ़ करता है। –

1

LOOM.NET पर एक नज़र डालें, वहां आपके पास एक पोस्ट कंपाइलर और रनटाइम वीवर है। बाद में आप जो भी चाहते हैं उसे संग्रहित करने में सक्षम हैं।

0

PostSharp XML configuration का उपयोग करना संभव होना चाहिए। एक्सएमएल कॉन्फ़िगरेशन प्रोजेक्ट लोडर में प्लग-इन और प्रोजेक्ट मॉडल का एकीकरण है।

.psproj का विवरण http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx पर पाया जा सकता है।

नोट, मैंने केवल उदाहरण देखे हैं कि PostSharp Toolkits इस XML कॉन्फ़िगरेशन का उपयोग कैसे करते हैं। लेकिन इसे उसी तरह कस्टम पहलुओं के लिए काम करना चाहिए।

चेतावनी: मैं Nuget से एक PostSharp टूलकिट की स्थापना मौजूदा ओवरराइट psproj फ़ाइल ध्यान दिया है। तो इसे वापस करने के लिए मत भूलना।

संबंधित मुद्दे