5

को पोर्टिंग मैं अपने पर्यावरण का वर्णन करेंगे परिवर्तन को तोड़ने: मैं Ninject + Ninject अवरोधन एक्सटेंशन सभी तरीकों, एक विशेष विशेषता के साथ चिह्नित के लिए इंटरसेप्टर का स्वत: पंजीकरण सक्षम करने के लिए काम कर रहा है। यह एक आम एओपी + विशेषताएं + डी कंटेनर परिदृश्य है।Ninject अवरोधन - जब Ninject 3.0

मेरी समस्या यह है: निनजेक्ट और निनजेक्ट इंटरसेप्शन एक्सटेंशन के नवीनतम संस्करण को पोर्ट करते समय - 3.0 जब मैं अपने इंटरसेप्टर चलाने के लिए जाता हूं तो मुझे अपवाद प्राप्त करना शुरू होता है। मेरा इंटरसेप्टर रजिस्ट्रेशनस्ट्रेटी जिम्मेदार प्रकार को हल करते समय और इंटरसेप्टर पंजीकृत करते समय ठीक काम करता है। लेकिन निम्न अपवाद में रोका विधि परिणाम चल:

System.ArgumentException : Interface not found. 
at System.RuntimeTypeHandle.VerifyInterfaceIsImplemented(RuntimeTypeHandle handle, RuntimeTypeHandle interfaceHandle) 
at System.RuntimeType.GetInterfaceMap(Type ifaceType) 
at Ninject.Extensions.Interception.Advice.Advice.MatchesMethod(IProxyRequest request) 
at System.Linq.Enumerable.WhereListIterator`1.MoveNext() 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
at System.Linq.Enumerable.ToList(IEnumerable`1 source) 
at Ninject.Extensions.Interception.Registry.AdviceRegistry.GetInterceptorsForRequest(IProxyRequest request) 
at Ninject.Extensions.Interception.Registry.AdviceRegistry.GetInterceptors(IProxyRequest request) 
at Ninject.Extensions.Interception.Wrapper.StandardWrapper.CreateInvocation(IProxyRequest request) 
at Ninject.Extensions.Interception.Wrapper.DynamicProxyWrapper.Intercept(IInvocation castleInvocation) 
at Castle.DynamicProxy.AbstractInvocation.Proceed() 
at Infrastructure.Tests.Persistance.Conversations.NinjectConversationInterceptorBehavior.ShouldCreateInterceptorOnImplicitConversation() in NinjectConversationInterceptorBehavior.cs: line 74 

मैं थोड़े परावर्तक का सहारा और के लिए छोड़ दिया हूँ Ninject अवरोधन एक्सटेंशन स्रोतों का उपयोग कर यह मुझे एक बुरी में छोड़ देता है इस समस्या के बारे में कुछ, पर्याप्त नहीं प्रलेखन के साथ रखा करने के लिए पद। जब Ninject 3.0 पोर्टिंग

किसी को भी एक ही अपवाद है? issue

+0

मैं भी इस का उपयोग कर रहा है या एक वर्ग इंजेक्षन (यह एक तरीका है कि वैसे भी नहीं कहा जा सकता रोकना बेकार है) : //stackoverflow.com/questions/5353476/ninject-one-interceptor-instance-per-one-class-instance-being-intercepted – Cortlendt

+0

अपडेट - मैं प्रकार इंटरफ़ेस लागू करता है और इसके चारों ओर से इंटरसेप्टर है कि हल करने कर रहा हूँ ऐसा लगता है कि इस अपवाद के लिए इंटरफेस को हल करना है। मुझे पूरी तरह से यकीन नहीं है, लेकिन मुझे लगता है कि कोड की रेखा - "इंटरफेस मैपिंग इंटरफेस मैप = this.method.DeclaringType.GetInterfaceMap (request.Method.DeclaringType);" सलाह वर्ग में अपवाद का स्रोत है, और अधिक सटीक होने के लिए - इसके पैरामीटर। – Cortlendt

+0

कृपया समस्या का प्रदर्शन करने वाली परियोजना को संलग्न करने वाले गितब पर एक बग रिपोर्ट जोड़ें। –

उत्तर

3

अवरोधन के व्यवहार बदल: विस्तार एक अंतरफलक पैदा करेगा

public class NinjectConversationInterceptorRegistrationStrategy : InterceptorRegistrationStrategy 
{ 
    public NinjectConversationInterceptorRegistrationStrategy(IAdviceFactory adviceFactory, 
                   IAdviceRegistry adviceRegistry) 
     : base(adviceFactory, adviceRegistry) 
    { 
    } 

    public override void Execute(IPlan plan) 
    { 
     var pcAttribute = plan.Type.GetOneAttribute<PersistenceConversationalAttribute>(); 

     if (pcAttribute != null) 
     { 
      if (pcAttribute.MethodsIncludeMode == MethodsIncludeMode.Implicit) 
      { 
       foreach (var mi in GetCandidateMethods(plan.Type)) 
       { 
        RegisterMethodInterceptors(plan.Type, mi); 
        if (!plan.Has<ProxyDirective>()) 
        { 
         plan.Add(new ProxyDirective()); 
        } 
       } 
      } 
      else 
      { 
       foreach (
        var mi in 
         GetCandidateMethods(plan.Type).Where(
          mi => mi.HasAttribute<PersistenceConversationAttribute>())) 
       { 
        if (!mi.IsVirtual) 
        { 
         throw new InvalidOperationException(
          string.Format("[PersistentCoversation] attribute used on non-virtual method {0}.{1}", 
              mi.DeclaringType.Name, 
              mi.Name)); 
        } 
        RegisterMethodInterceptors(plan.Type, mi); 
        if (!plan.Has<ProxyDirective>()) 
        { 
         plan.Add(new ProxyDirective()); 
        } 
       } 
      } 
     } 
    } 

    protected virtual void RegisterMethodInterceptors(Type type, MethodInfo method) 
    { 
     IAdvice advice = this.AdviceFactory.Create(method); 
     advice.Callback = GetIntercepor; 
     this.AdviceRegistry.Register(advice); 
    } 

    protected virtual IInterceptor GetIntercepor(IProxyRequest arg) 
    { 
     var interceptor = new NinjectConversationLazyInterceptor(arg.Kernel); 
     return interceptor; 
    } 

    protected override bool ShouldIntercept(MethodInfo methodInfo) 
    { 
     if (IsPropertySetter(methodInfo)) 
     { 
      return false; 
     } 
     var ret = base.ShouldIntercept(methodInfo); 
     return ret; 
    } 

    private static bool IsPropertySetter(MethodBase methodInfo) 
    { 
     return methodInfo.IsSpecialName && methodInfo.Name.StartsWith("set_"); 
    } 
} 
1

जारी करना परियोजना के Git हब में ले जाया गया:

यहाँ कोड मैं स्वचालित रूप से विशेषता के आधार पर इंटरसेप्टर रजिस्टर करने के लिए उपयोग प्रॉक्सी जब क्लास प्रॉक्सी की बजाय एक इंटरफ़ेस इंजेक्शन दिया जाता है क्योंकि इसका लाभ यह है कि विधियों को वर्चुअल होने की आवश्यकता नहीं है। http: या तो आप, इंटरफ़ेस करने के लिए डाल दिया अवरोधन से विधि निकालने की ज़रूरत बजाय एक अंतरफलक के

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