2016-08-01 13 views
9

नया कॉन्फ़िगरेशनबिल्डर, और विकल्प पैटर्न का उपयोग कर नेट कोर पुस्तकालयों में मेरा पहला छोटा उद्यम।नेट कोर/कंसोल आवेदक/कॉन्फ़िगरेशन/एक्सएमएल

लॉट के लिए यहाँ अच्छा उदाहरण के: https://docs.asp.net/en/latest/fundamentals/configuration.html और उदाहरण here

मद 1. यह इस गैर MVC अनुप्रयोगों के साथ इस्तेमाल किया जा सकता कहते हैं की एक अच्छी प्रतिलिपि, लेकिन कैसे MVC के बिना इसका इस्तेमाल करने पर कोई उदाहरण - विशेष रूप से यदि आप एक कस्टम, दृढ़ता से टाइप की गई कक्षा का उपयोग कर रहे हैं। मैं कंसोल एप्लिकेशन का उपयोग करके निर्भरता इंजेक्शन, कॉन्फ़िगरेशन और लॉगिंग का सेटअप दिखाने का एक उदाहरण देखना चाहता हूं।

आइटम 2. यह कहता है कि आप वापस लिख सकते हैं, लेकिन फाइल स्टोर में किसी भी बदलाव को कैसे बनाए रखना है इसके बारे में कोई उदाहरण या दस्तावेज नहीं है। मैं दृढ़ता से टाइप की गई कक्षा का उपयोग करके कॉन्फ़िगरेशन में वापस कैसे परिवर्तन करता हूं इसका एक उदाहरण देखना चाहता हूं। जेसन या एक्सएमएल दोनों में?

मद 3. सभी उदाहरणों की आवश्यकता होती है एक हाथ प्रारंभिक फ़ाइल पर बमबारी - एक उदाहरण है जहां प्रारंभिक JSON/XML फ़ाइल एक जोरदार टाइप वर्ग से बनाई गई है देखना चाहेंगे (काम में आता है जब वहाँ के लिए कई मापदंडों हैं आवेदन पत्र)।

यदि मैं इस पर पर्याप्त समय बिता सकता हूं (दस्तावेज़ में पहले से ही एक उदाहरण दोबारा पोस्ट करने के बजाय) मैं करूँगा! यदि आप एक पोस्ट/दस्तावेज के बारे में जानते हैं जो मेरी मदद करेगा, तो मैं इसकी सराहना करता हूं।

+0

आप कहते हैं कि आपके पास प्रश्न है, लेकिन मुझे कोई प्रश्न नहीं दिख रहा है, केवल लापता उदाहरणों के बारे में शिकायत है। यदि आप उन उदाहरणों के लिए पूछ रहे हैं, तो यह नहीं है कि एसओ क्या है। – svick

+0

मैं जो भी उदाहरण ढूंढ रहा हूं, उसे मैं देख सकता हूं, मुझे उम्मीद है कि एक और डेवलपर मुझे सही दिशा में इंगित कर सकता है, या मुझे कुछ दस्तावेज पर इंगित कर सकता है। – codeputer

+0

माइक्रोसॉफ्ट समुदाय को इस दस्तावेज साइटों के साथ-साथ स्टैक ओवरफ्लो दस्तावेज़ीकरण पर ऐसे विषयों को लिखने का स्वागत करता है। आप उन पर नजर रख सकते हैं या वहां एक अनुरोध उठा सकते हैं। इस तरह एक तेज़ चलने वाला प्लेटफॉर्म इसे दस्तावेज़ में उबाऊ बनाता है, इसलिए मुझे आश्चर्य नहीं है कि कई चीजें गायब हैं। –

उत्तर

19

मैं निर्भरता इंजेक्शन, लॉगिंग और कॉन्फ़िगरेशन के लिए .NET कोर 1.0.0 कंसोल एप्लिकेशन को कैसे कॉन्फ़िगर कर सकता हूं?

आरसी 2 के बाद जो कुछ लिखा गया था उसे बहिष्कृत किया गया है। (issue देखें)। Fortunatelly वहाँ उत्कृष्ट जानकारी के साथ कुछ अपडेट किए गए पोस्ट कर रहे हैं:

Essential .NET - Dependency Injection with .NET Core

Essential .NET - Logging with .NET Core

मैं निम्नलिखित समाधान के साथ आया था। मैं शर्त लगाता हूं कि चीजें बेहतर हो सकती हैं, कृपया टिप्पणियां छोड़ दें ताकि मैं इस जवाब को बेहतर बना सकूं।

मेरी static void Main में, मैं

  • सेटअप निर्भरता इंजेक्शन
  • आह्वान ConfigureServices
  • मेरी Application वर्ग डि
  • का उपयोग कर इन्स्तांत 'के लिए async Application.Run' सिंक मुख्य 'से
  • स्विच () ' (यह मुझे समझ में आता है कि जितनी जल्दी हो सके एसिंक पर स्विच करें और केवल एक बार।)

मेरी Application कक्षा में:

  • मैं कक्षा निर्माता पर जितना संभव हो उतना इंजेक्षन।
  • रन() विधि पर कोई अपवाद पकड़ें।

यहां कोड है।

using System; 
using System.Threading.Tasks; 
using Microsoft.Extensions.Logging; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Options; 
using Microsoft.Extensions.Configuration; 
using System.IO; 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     IServiceCollection serviceCollection = new ServiceCollection(); 

     ConfigureServices(serviceCollection); 

     // Application application = new Application(serviceCollection); 
     IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); 

     var app = serviceProvider.GetService<Application>(); 

     // For async 
     Task.Run(() => app.Run()).Wait(); // Exceptions thrown here will be lost! Catch them all at Run() 
     // Otherwise use sync as in: app.Run();    
    } 

    private static void ConfigureServices(IServiceCollection services) 
    { 
     ILoggerFactory loggerFactory = new LoggerFactory() 
      .AddConsole() 
      .AddDebug(); 

     services.AddSingleton(loggerFactory); // Add first my already configured instance 
     services.AddLogging(); // Allow ILogger<T> 

     IConfigurationRoot configuration = GetConfiguration(); 
     services.AddSingleton<IConfigurationRoot>(configuration); 

     // Support typed Options 
     services.AddOptions(); 
     services.Configure<MyOptions>(configuration.GetSection("MyOptions")); 

     services.AddTransient<Application>(); 
    } 

    private static IConfigurationRoot GetConfiguration() 
    { 
     return new ConfigurationBuilder() 
      .SetBasePath(Directory.GetCurrentDirectory()) 
      .AddJsonFile($"appsettings.json", optional: true) 
      .Build(); 
    } 
} 

public class MyOptions 
{ 
    public string Name { get; set; } 
} 

public class Application 
{ 
    ILogger _logger; 
    MyOptions _settings; 

    public Application(ILogger<Application> logger, IOptions<MyOptions> settings) 
    { 
     _logger = logger; 
     _settings = settings.Value; 
    } 

    public async Task Run() 
    { 
     try 
     { 
      _logger.LogInformation($"This is a console application for {_settings.Name}"); 
     } 
     catch (Exception ex) 
     { 
      _logger.LogError(ex.ToString()); 
     } 
    } 
} 
} 

AppSettings.json फ़ाइल:

{ 
    "MyOptions": { 
    "Name" : "John" 
    } 
} 

और project.json फ़ाइल:

"dependencies": { 
    "Microsoft.Extensions.Configuration": "1.0.0", 
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.DependencyInjection": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.Extensions.Options": "1.0.0", 
    "Microsoft.Extensions.PlatformAbstractions": "1.0.0", 
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 

अपने प्रश्न # 2 पर: मैं दस्तावेज़ पढ़ चुके हैं और जब तक मैं कुछ याद आ रही है , यह नहीं कहता कि आप कॉन्फ़िगरेशन लिख सकते हैं। मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं, जब तक कि आप JST फ़ाइलों को मैन्युअल रूप से Newtonsoft.JSON का उपयोग करके संपादित नहीं करते।

यदि नाम/मूल्य जोड़ी कॉन्फ़िगरेशन पर लिखी गई है, तो यह जारी नहीं है। यह का अर्थ है कि स्रोत फिर से पढ़े जाने पर लिखित मान खो जाएगा।

आपके प्रश्न के लिए # 3 मैंने एक डिफ़ॉल्ट AppSettings.json फ़ाइल शामिल की है। आपकी कॉन्फ़िगरेशन में एक अनुभाग होना चाहिए जहां इसकी सेटिंग नाम से आपकी सेटिंग्स वर्ग के सार्वजनिक गुणों से मिलती है।

+0

आलेख लिंक से वास्तव में क्या गुम है, विस्तार विधियों तक पहुंच प्राप्त करने के लिए उपयोग कथन (और संबंधित NuGet संकुल आवश्यक) है। सबक सीखा - नेट कोर में विस्तार विधियों से सावधान रहें! – codeputer

+0

अभी भी एक एक्सएमएल फ़ाइल से पढ़ने के साथ लड़ रहा है, जेएसओएन के विपरीत। रयान क्रॉफर्ड ने मुझे शामिल करने के लिए ट्वीट किया .क्स्टेंट। कॉन्फ़िगरेशन.एक्सएमएल, लेकिन मुझे यूटीएफ -16 अपवाद मिल रहा है (कन्वर्ट करने में असमर्थ?)। – codeputer

+0

वाह मैंने थोड़ी देर के लिए यूटीएफ -16 देखा है ... जांचने की चीजें आपकी टेक्स्ट फ़ाइल एन्कोडिंग (नोटपैड पर: - एन्कोडिंग के रूप में सहेजें) और आपके ' 'टैग। मैं नोटपैड या वीआई के साथ बनाई गई एक सादे सरल XML फ़ाइल से शुरू करने का सुझाव देता हूं। (पेस्ट कॉपी न करें, बस टाइप करें)। एक बार यह काम कर रहा है, एक्सएमएल बढ़ाने की कोशिश करें। –