امتداد اعتراض Ninject مع WCF يعطيني "مرجع كائن لم يتم تعيينه على مثيل لكائن." خطأ

StackOverflow https://stackoverflow.com/questions/4297955

سؤال

لقد بدأت مع ملحق اعتراض Ninject ولا يمكنني تشغيله في خدمة WCF الخاصة بي. مع امتداد WCF ، يعمل Ninject بشكل جيد ، إنه الاعتراض الذي يمنحني المتاعب. ربما أفعل ذلك خطأ؟ عندما أحاول إضافة linfumodel في مُنشئ kernel ، يخبرني أنه تم تحميله بالفعل ، لذلك أعتقد أن هذا جيد.

في الأساس ، يقوم كل اعتراض على الربط بتقديم خدمة WCF الخاصة بي ، لكن مفهوم MethodInception يعمل فقط على الخدمة (getData () في عقد الخدمة).

تحرير: ما يلي أيضًا لا يعمل:

  Kernel.Intercept((request) => request.Method.Name.StartsWith("Get"))
            .With<TimingInterceptor>(); 

نهاية التحرير

protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new ServiceModule());

        //var binding = kernel.Bind<MockBroker>().ToSelf();
        //binding.Intercept().With<TimingInterceptor>(); // THIS BREAKS

        kernel.InterceptAfter<Watch>(m => m.GetData(0), i => { i.ReturnValue = "BLABLABLA"; log.Info("INTERCEPTED!"); }); //WORKS

        //kernel.Bind<Watch>().ToSelf().Intercept().With(new TimingInterceptor()); //BREAKS
        //kernel.Bind<FileSystemBroker>().ToSelf().Intercept().With<TimingInterceptor>(); //BREAKS
        return kernel;
    }

public class TimingInterceptor : SimpleInterceptor
{
    readonly Stopwatch _stopwatch = new Stopwatch();
    //private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    protected override void BeforeInvoke(IInvocation invocation)
    {
        _stopwatch.Start();
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        _stopwatch.Stop();
        string message = string.Format("[Execution of {0} took {1}.]",
                                        invocation.Request.Method,
                                        _stopwatch.Elapsed);
        //log.Info(message);
       _stopwatch.Reset();
    }
}

شكرا لك ، Rinze

هل كانت مفيدة؟

المحلول

Linfu يدعم فقط اعتراض الطريقة الافتراضية. قم بتغيير جميع الأساليب المعتادة إلى الظاهري أو التبديل إلى DynamicProxy2.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top