2016-07-15 13 views
12

में क्लास लाइब्रेरी से appsetting.json तक पहुंच क्लास लाइब्रेरी से appsetting.json फ़ाइल तक पहुंचने का प्रयास कर रहा हूं। अब तक जो समाधान मिला है वह Microsoft.Extensions.Configuration से कॉन्फ़िगरेशन क्लास कार्यान्वयन इंटरफ़ेस IConfiguration बनाना है और जेसन फ़ाइल को कक्षा में जोड़ना और उससे पढ़ना है।एएसपीनेट-कोर

var configuration = new Configuration(); 
configuration.AddJsonFile("appsetting.json"); 
var connectionString= configuration.Get("connectionString"); 

इस रूप में हम json हर बार जब हम appsetting विन्यास का उपयोग करना फ़ाइल जोड़ने के लिए बुरा विकल्प हो रहा है। हमारे पास ConfigurationManagerएएसपी.NET में कोई विकल्प नहीं है।

+0

[सी # कक्षा लाइब्रेरी में उपयोग करना IConfiguration] (https://stackoverflow.com/questions/27880433/using-iconfiguration-in-c-sharp-class-library) –

+0

की संभावित डुप्लिकेट का एक उदाहरण देख सकते हैं क्या एक ही मुद्दा है कि [सी # कक्षा पुस्तकालय में आईसीओफ़िगरेशन का उपयोग] (https://stackoverflow.com/q/27880433/1647238), [मेरा उत्तर] देखें (https://stackoverflow.com/a/47645131/1647238) –

उत्तर

13

मुझे लगता है कि आप वेब अनुप्रयोग से appsettings.json फ़ाइल तक पहुंच बनाना चाहते हैं क्योंकि कक्षा पुस्तकालयों में डिफ़ॉल्ट रूप से appsettings.json नहीं है।

मैं एक मॉडल क्लास बनाता हूं जिसमें गुण हैं जो appsettings.json में किसी अनुभाग में सेटिंग्स से मेल खाते हैं।

appsettings.json में धारा

"ApplicationSettings": { 
    "SmtpHost": "mydomain.smtp.com", 
    "EmailRecipients": "[email protected];[email protected]" 
} 

मिलान मॉडल वर्ग

namespace MyApp.Models 
{ 
    public class AppSettingsModel 
    { 
     public string SmtpHost { get; set; } 
     public string EmailRecipients { get; set; } 
    } 
} 

फिर उस मॉडल वर्ग को पॉप्युलेट और डि कंटेनर में IOptions संग्रह में जोड़ना (यह किया जाता है स्टार्टअप क्लास की Configure() विधि में)।

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings")); 

// Other configuration stuff 

services.AddOptions(); 

फिर आप उस वर्ग को किसी भी विधि से एक्सेस कर सकते हैं जिसे फ्रेमवर्क कन्स्ट्रक्टर में पैरामीटर के रूप में जोड़कर कॉल करता है। ढांचा कन्स्ट्रक्टर को कक्षा खोजने और प्रदान करने में संभालता है।

public class MyController: Controller 
{ 
    private IOptions<AppSettingsModel> settings; 

    public MyController(IOptions<AppSettingsModel> settings) 
    { 
     this.settings = settings; 
    } 
} 

फिर जब एक वर्ग पुस्तकालय में एक विधि सेटिंग्स की जरूरत है, मैं या तो सेटिंग्स को एकल पास या संपूर्ण वस्तु गुजरती हैं।

+0

निश्चित नहीं है कि कुछ बदल गया है क्योंकि इसे उत्तर के रूप में स्वीकार किया गया था, लेकिन जब मैंने दो दिन पहले एक नई परियोजना शुरू की थी तो यह मेरे लिए काम नहीं करता था। मेरे द्वारा इसे काम करने के लिए किए गए परिवर्तन थे: IOptions सेटिंग्स; के बजाय, मुझे इसे AppSettingsModel सेटिंग्स में बदलना पड़ा; फिर नियंत्रक कन्स्ट्रक्टर में, मैंने यह लाइन बदल दी .settings = सेटिंग्स; इस। सेटिंग्स = सेटिंग्स। वैल्यू; फिर यह काम करना शुरू कर दिया। – Syed

+0

उपर्युक्त उत्तर सेवाओं के बाद स्टार्टअप में कोड की निम्न पंक्ति भूल गया। कॉन्फ़िगर करें <>() कॉल: 'सेवाएं। अतिरिक्त विकल्प();' –

+0

@StephenPorter अपने उत्तर में अपनी रेखा जोड़ने में सहज महसूस करता है। – gtzinos

20

मुझे पता है कि एक उत्तर पहले ही स्वीकार कर लिया गया है, लेकिन यह प्रश्न Google पर एक शीर्ष हिट है और ओपीएस प्रश्न कक्षा पुस्तकालयों के बारे में है, न कि एएसपी.नेट वेब ऐप या वेबएपी जो स्वीकार किए गए उत्तर का उपयोग करता है।

आईएमओ, कक्षा पुस्तकालयों को एप्लिकेशन सेटिंग्स का उपयोग नहीं करना चाहिए और ऐसी सेटिंग्स के लिए अज्ञेयवादी होना चाहिए। अगर आपको अपनी कक्षा पुस्तकालय में एप्लिकेशन सेटिंग्स की आवश्यकता है, तो आपको उन सेटिंग्स को अपने उपभोक्ता से प्रदान करना चाहिए। आप इस On This SO Question

+3

मैं आंशिक रूप से सहमत हूं; ** परीक्षण परियोजनाओं ** के लिए जो एक डॉटनेट कोर समाधान में कक्षा पुस्तकालयों के रूप में सेट हैं, यह ऐप्स सेटिंग्स का उपयोग या एम्बेड करने के लिए पूरी तरह से स्वीकार्य है। इस मामले में, परीक्षण परियोजना उदा। पाठ्यक्रम पुस्तकालय _is_ पाठ्यक्रम के उपभोक्ता। –

+0

@Moriarty True, लेकिन कुछ मामलों में आपके पास कई वातावरण भी हो सकते हैं जिनमें आपका परीक्षण सूट निष्पादित किया जा सकता है। इस मामले में, एम्बेडेड सेटिंग्स काम नहीं करेगी (उदाहरण के लिए आपके पास एकीकरण परीक्षण है जिसे एपीआई से बात करने के लिए पर्यावरण की आवश्यकता है)। मुझे नहीं लगता कि यह हमेशा एक तरह से सही है या किसी और मामले में हमेशा मामला है। –

+0

बेशक कक्षा पुस्तकालयों को स्थानीय डीबी उदाहरण को इंगित करने वाली कनेक्शन स्ट्रिंग का उपयोग करना चाहिए। जबकि सीआई सिस्टम द्वारा एक और उदाहरण का उपयोग करने के लिए उस सेटिंग को ओवरराइट किया गया है। IMHO इस उत्तर में अभी तक कोई समाधान नहीं है। यह एएसपीनेट कोर के बारे में नहीं है। इसके बारे में .NET कोर एक एपसेटिंग पढ़ रहा है! – Pascal