2012-04-03 27 views
18

काम कर रहा है। मैं इसे समझने के लिए उम्र के लिए प्रयास कर रहा हूं। मैं लाइनNinject.Extensions नहीं मिल सकता है।

Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>(); 

लोड करने में त्रुटि Ninject घटक IAdviceFactory पर निम्न अपवाद हो रही है जब मैं एक इंटरसेप्टर के साथ मेरी कक्षा बाध्य करने के लिए प्रयास करें। ऐसा कोई घटक कर्नेल के घटक कंटेनर में पंजीकृत किया गया है

मैं अपने बाइंडिंग और मेरी आखिरी प्रयास स्थापित करने के लिए एक मॉड्यूल का उपयोग के साथ के बारे में के साथ और LoadExtensions बिना की कोशिश की है के साथ, इस

internal class AppConfiguration 
{ 

    internal AppConfiguration() 
    { 
     var settings = new NinjectSettings() { LoadExtensions = false }; 
     Kernel = new StandardKernel(settings); 
     Load(); 
    } 

    internal StandardKernel Kernel { get; set; } 

    public static AppConfiguration Instance 
    { 
     get { return _instance ?? (_instance = new AppConfiguration()); } 
    } 

    private static AppConfiguration _instance; 

    private void Load() 
    { 
     Kernel.Bind<ILoggerAspect>().To<Log4NetAspect>().InSingletonScope(); 
     Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>(); 
    } 

    internal static StandardKernel Resolver() 
    { 
     return Instance.Kernel; 
    } 
} 

तरह लग रहा है मेरे लॉगर गुण इस

public class LogAttribute : InterceptAttribute 
{ 
    public override IInterceptor CreateInterceptor(IProxyRequest request) 
    { 
     return request.Context.Kernel.Get<ILoggerAspect>(); 
    } 
} 

और यह

public class Log4NetAspect : SimpleInterceptor, ILoggerAspect 
{ 
    protected override void BeforeInvoke(IInvocation invocation) 
    { 
     Debug.WriteLine("Running " + invocation.ReturnValue); 
     base.BeforeInvoke(invocation); 
    } 

    public new void Intercept(IInvocation invocation) 
    { 
     try 
     { 
      base.Intercept(invocation); 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine("Exception: " + e.Message); 
     } 
    } 

    protected override void AfterInvoke(IInvocation invocation) 
    { 
     Debug.WriteLine("After Method"); 
     base.AfterInvoke(invocation); 
    } 
} 
की तरह मेरे इंटरसेप्टर की तरह दिखता है

उत्तर

25

अधिकतर संभावना है कि आपने अपने आवेदन के साथ Ninject.Extensions.Interception.DynamicProxy या Ninject.Extensions.Interception.Linfu को तैनात नहीं किया [और Ninject.Extensions.Interception]। आपको उनमें से एक को चुनना होगा।

कोड के साथ अभी आपके पास यह है (LoadExtensions=false) यह विशिष्ट इंटरसेप्शन लाइब्रेरी लेने में विफल रहेगा - आपको इसे हटा देना चाहिए और सामान्य एक्सटेंशन लोडिंग को अवरोध बिट्स के लिए निर्माण पर कर्नेल में विस्तार को तार करना चाहिए इसे उठाएं।

+0

मैंने उन्हें नुजेट के साथ पकड़ने की कोशिश की, क्या आपको दोनों या सिर्फ एक की आवश्यकता है? –

+2

धन्यवाद कि यह था। Nuget पैकेज क्यों नहीं इनमें से एक डिफ़ॉल्ट के रूप में जोड़ता है? डेवलपर से इसका उपयोग करने से यह कोई फर्क नहीं पड़ता कि इसका क्या उपयोग होता है। –

+0

जानना उपयोगी है, मैं इसे LoadExtensions = false का उपयोग करके काम करने की कोशिश कर रहा था और कर्नेल – user1039513

0

Remo Gloor's answer जो मुझे Ninject.Extensions.Interception.DynamicProxy के लिए nuget पैकेज जोड़ने की ओर इशारा किया के अलावा, मैं ओ पी के रूप में ही अपवाद हो रही है, जब तक मैं मैन्युअल रूप से भरी हुई एक DynamicProxyModule - FuncModule मैन्युअल रूप में अच्छी तरह भरी हुई है, एक ऐसी ही त्रुटि को हल करने के लिए कारखाना विस्तार शामिल है:

_kernel = new StandardKernel(
    new NinjectSettings{LoadExtensions = true}, 
    new FuncModule(), 
    new DynamicProxyModule()); // <~ this is what fixed it 
संबंधित मुद्दे