c# - निजी सदस्य एपीआई विधि कॉल पर अचानक अशक्त है




asp.net-web-api dependency-injection (2)

यदि आप लिनफू का उपयोग करते हैं (जो आपको करना चाहिए, क्योंकि डायनेमिक प्रोक्सि को अभी भी पैरामीटर वाले निर्माता की आवश्यकता है), तो समाधान बहुत आसान है: बस उस UnitOfWorkAttribute virtual साथ एनोटेट करने वाली विधि बनाएं

मैंने कुछ परीक्षणों के माध्यम से यह पाया: कुछ प्रयासों के बाद, मुझे पता चला कि अगर आप सिर्फ योजना को plan.Add(new ProxyDirective()); तो सबकुछ काम किया जाता है। plan.Add(new ProxyDirective()); । बेशक, इंटरसेप्टर लागू नहीं किया गया था, लेकिन यह इस तथ्य की ओर इशारा करता है कि प्रॉक्सी क्लास को दोष देना था।

अजीब सामान चल रहा है: मेरी वेब एपीआई में, मैं एक नियोजक को Ninject का उपयोग करने पर नियंत्रक में इंजेक्ट करता हूं रिपॉजिटरी एक निजी रीडोनली सदस्य चर में संग्रहित हो जाती है। पूरी तरह से ठीक काम करता है! जब एक एपीआई पद्धति को फोन किया जाता है, तो मैं चर का उपयोग करता हूं - केवल यह देखने के लिए कि यह अचानक अशक्त है!

छद्म उदाहरण:

public class MyController : ApiController {

  private readonly IRepo _repo;

  public MyController(IRepo repo) {
     Guard.AgainstNullArgument("repo", repo); // guarding to 
                                                          // make sure it's not null
                                                          // (would throw ex)
     _repo = repo; <--- successfully injected
  }

  // calling this method
  public HttpResponseMessage TestMethod() {
     _repo.. <--- suddenly null
  }

}

मैंने इस समस्या को एक छोटे से विस्तार से पता लगाया है: नियंत्रक के तरीकों में से एक (जो कि प्राप्त की जाने वाली कोई भी नहीं है) का कस्टम एट्रिब्यूट के साथ एनोटेट किया गया है जो काम की एक इकाई के साथ विधि को अवरुद्ध करने का निर्देश देता है। अगर मैं विशेषता को दूर लेता हूँ, तो सब कुछ जादूगर फिर से काम करता है।

UnitOfWorkAttribute.cs

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Interface)]
public class UnitOfWorkAttribute : Attribute
{
}

AttributeInterceptionStrategy.cs (निंजा के लिए)

http://pastebin.com/Qg6tQWye

StartupConfig.cs (रचना रूट, IoC कॉन्फ़िगरेशन आदि)

http://pastebin.com/fcuSdujj

EfUnitOfWorkInterceptor.cs

public class EfUnitOfWorkInterceptor : SimpleInterceptor
{

    private readonly IUnitOfWork _unitOfWork;

    public EfUnitOfWorkInterceptor(IUnitOfWork unitOfWork)
    {
        Guard.AgainstNullArgument("unitOfWork", unitOfWork);
        _unitOfWork = unitOfWork;
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        if(!_unitOfWork.Commited)
            _unitOfWork.Commit();

        _unitOfWork.Dispose();
    }
}

संपादित करें

मैंने वाकई हर जगह ब्रैकपॉइंट डाल दिया है जो पता लगाने के लिए क्या हो रहा है। नियंत्रक पर नियंत्रक को सुनिश्चित करने के लिए कि पूरे वर्ग को गड़बड़ी नहीं मिलती है और पढ़ने वाले सदस्य को संपत्ति प्राप्त करने वाले / सेटर के साथ संपत्ति में भी बदल दिया जाता है, जहां मुझे पता चलता है कि यह दो बार सौंपा गया है या नहीं। कुछ भी सटीक नहीं होता है।

2 संपादित करें

ढेर

http://pastebin.com/pQULHLT0

Ninject.Extensions.Interception.dll!Ninject.Extensions.Interception.Injection.Dynamic.DynamicMethodInjector.Invoke(object target = {EIT.Management.Configuration.Web.Api.Controllers.SetupGroupController}, object[] arguments = {object[2]})   Unbekannt
    Ninject.Extensions.Interception.dll!Ninject.Extensions.Interception.Invocation.Invocation.CallTargetMethod()    Unbekannt

3 संपादित करें

असली दुनिया कोड: http://pastebin.com/SqpR9KNR


यह अजीब है! मुझे लगता है कि आपके पास एक और निर्माता है, जो आपने अपना _repo सेट नहीं किया है , फिर उसके द्वारा तत्काल नियंत्रक का एक नया उदाहरण।







aop