2016-05-12 4 views
8

अनुरोध डेटा ले जाने का बेहतर तरीका कौन सा है (क्या दो तरीकों के बीच कोई अंतर है)?HttpContext.Items बनाम स्कोप्ड सेवा

उदाहरण के लिए:

विकल्प 1 (Scoped Service):

//Scoped Service(this may be interface) 
public class SampleScopedService 
{ 
    public string Data { get; set; } 
} 

//Register service 
services.AddScoped<SampleScopedService>(); 

//Set and Get Data 
public class SampleUsage 
{ 
    private readonly SampleScopedService _sampleScopedService; 
    public SampleUsage(SampleScopedService sampleScopedService) 
    { 
     _sampleScopedService = sampleScopedService; 
     // _sampleScopedService.Data = "Sample"; 
     // _sampleScopedService.Data 
    } 
} 

विकल्प 2 (HttpContext.Items)

//Scoped Service 
public class SampleScopedService 
{ 
    private readonly IHttpContextAccessor _accessor; 

    public SampleScopedService(IHttpContextAccessor accessor) 
    { 
     _accessor = accessor; 
    } 
    public string GetData() 
    { 
     return (string)_accessor.HttpContext.Items["Data"]; 
    } 
} 

//Register service 
services.AddScoped<SampleScopedService>(); 

//Set Data 
HttpContext.Items[“Data”] = ”Sample”; 

//Get Data 
public class SampleUsage 
{ 
    private readonly SampleScopedService _sampleScopedService; 
    public SampleUsage(SampleScopedService sampleScopedService) 
    { 
     _sampleScopedService = sampleScopedService; 
     //_sampleScopedService.GetData(); 
    } 
} 

उत्तर

4

docs के अनुसार:

बचें stor सीधे डीआई में डेटा और विन्यास आईएनजी। उदाहरण के लिए, उपयोगकर्ता की शॉपिंग कार्ट को आमतौर पर कंटेनर में सेवाओं में नहीं जोड़ा जाना चाहिए। कॉन्फ़िगरेशन विकल्प मॉडल का उपयोग करना चाहिए। इसी तरह, "डेटा धारक" ऑब्जेक्ट्स से बचें जो केवल अन्य ऑब्जेक्ट तक पहुंच की अनुमति देने के लिए मौजूद हैं। यदि संभव हो तो डीआई के माध्यम से आवश्यक वास्तविक वस्तु का अनुरोध करना बेहतर है।

के बाद से विकल्प 1 "डेटा धारक" का उदाहरण है, जहाँ तक संभव हो हम इसे से बचना चाहिए।

इसके अलावा, विकल्प 1Captive Dependency कारण अगर आप ध्यान नहीं देते हैं सकता है।

तो सिंगलटन जीवन भर साथ विकल्प 2 का उपयोग कर विकल्प 1 का उपयोग कर की तुलना में बेहतर तरीका है।

+0

मुझे लगता है कि "डि में सीधे डेटा और विन्यास संगृहीत करने से बचें" है के खिलाफ 'services.AddScoped (एसपी => नई DataHolder {मूल्य =" का मान "})' के बारे में क्या "यह वास्तविक आइटम की जरूरत अनुरोध करने के लिए बेहतर है DI के माध्यम से, यदि संभव हो तो "- यह' सेवाओं की तरह है। AddScoped (sp => sp.GetService () .GetData()) '। मेरे अभ्यास में मुझे अक्सर कुछ अनुरोधों को डीबी/क्यूई-संदेश से पुनर्प्राप्त करने की आवश्यकता होती है, जिसे कुछ अनुरोधों में बाद में अनुरोध प्रक्रिया में उपयोग किया जाता है। इस तरह के मामले में मुझे विकल्प 1 का उपयोग करने में कुछ भी बुरा नहीं लगता है ('HttpContext.Items' केवल तारों को पकड़ सकता है, यानी अतिरिक्त क्रमबद्धता आवश्यकता)। – smg

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