এএসপি.নেট কোর এখানে একটি নতুন কনফিগারেশন সিস্টেমকে সমর্থন করে: https://docs.asp.net/en/latest/fundamentals/configration.html
এই মডেলটি। নেট কোর কনসোল অ্যাপ্লিকেশনগুলিতেও সমর্থিত?
না হলে আগের app.config
এবং ConfigurationManager
মডেলের বিকল্প কী ?
এএসপি.নেট কোর এখানে একটি নতুন কনফিগারেশন সিস্টেমকে সমর্থন করে: https://docs.asp.net/en/latest/fundamentals/configration.html
এই মডেলটি। নেট কোর কনসোল অ্যাপ্লিকেশনগুলিতেও সমর্থিত?
না হলে আগের app.config
এবং ConfigurationManager
মডেলের বিকল্প কী ?
উত্তর:
আপনি এই কোড স্নিপেট ব্যবহার করতে পারেন। এটিতে কনফিগারেশন এবং ডিআই অন্তর্ভুক্ত রয়েছে।
public class Program
{
public static ILoggerFactory LoggerFactory;
public static IConfigurationRoot Configuration;
public static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (String.IsNullOrWhiteSpace(environment))
throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT");
Console.WriteLine("Environment: {0}", environment);
var services = new ServiceCollection();
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory))
.AddJsonFile("appsettings.json", optional: true);
if (environment == "Development")
{
builder
.AddJsonFile(
Path.Combine(AppContext.BaseDirectory, string.Format("..{0}..{0}..{0}", Path.DirectorySeparatorChar), $"appsettings.{environment}.json"),
optional: true
);
}
else
{
builder
.AddJsonFile($"appsettings.{environment}.json", optional: false);
}
Configuration = builder.Build();
LoggerFactory = new LoggerFactory()
.AddConsole(Configuration.GetSection("Logging"))
.AddDebug();
services
.AddEntityFrameworkNpgsql()
.AddDbContext<FmDataContext>(o => o.UseNpgsql(connectionString), ServiceLifetime.Transient);
services.AddTransient<IPackageFileService, PackageFileServiceImpl>();
var serviceProvider = services.BuildServiceProvider();
var packageFileService = serviceProvider.GetRequiredService<IPackageFileService>();
............
}
}
ওহ, এবং প্রকল্প.জসনে যুক্ত করতে ভুলবেন না
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true,
"copyToOutput": {
"includeFiles": [
"appsettings.json",
"appsettings.Integration.json",
"appsettings.Production.json",
"appsettings.Staging.json"
]
}
},
"publishOptions": {
"copyToOutput": [
"appsettings.json",
"appsettings.Integration.json",
"appsettings.Production.json",
"appsettings.Staging.json"
]
},
...
}
.NET কোর 2.0 কনসোল অ্যাপের জন্য, আমি নিম্নলিখিতগুলি করেছি:
{ "myKey1" : "my test value 1", "myKey2" : "my test value 2", "foo" : "bar" }
প্রকল্পটি যখনই নির্মিত হয় আউটপুট ডিরেক্টরিতে ফাইলটি অনুলিপি করতে কনফিগার করুন (ভিএস -> সমাধান এক্সপ্লোরার -> ফাইলটিতে ডান ক্লিক করুন -> 'সম্পত্তি' নির্বাচন করুন -> উন্নত -> আউটপুট ডিরেক্টরিতে অনুলিপি করুন -> 'সর্বদা অনুলিপি করুন' নির্বাচন করুন)
আমার প্রকল্পে নিম্নলিখিত নুগেট প্যাকেজটি ইনস্টল করুন:
Program.cs (বা যেখানেই Main()
অবস্থিত) এর সাথে নিম্নলিখিতগুলি যুক্ত করুন :
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
var configuration = builder.Build();
// rest of code...
}
তারপরে নিম্নলিখিত যে কোনও একটি ব্যবহার করে মানগুলি পড়ুন:
string myKey1 = configuration["myKey1"];
Console.WriteLine(myKey1);
string foo = configuration.GetSection("foo").Value;
Console.WriteLine(foo);
IConfigurationRoot
এখনও নেট কোর 2.0 তে উপলব্ধ । এটি উত্তরাধিকার সূত্রে পেয়েছে IConfiguration
তবে এটি এর উদ্ভূত কেস হিসাবে বিবেচিত যা সাধারণত ব্যবহৃত হয় না । নির্বিশেষে, কোড উদাহরণটি এটিকে অন্তর্ভুক্ত না করার এবং কোনও বিভ্রান্তি এড়াতে আপডেট করা হয়েছে।
আপনি ব্যবহার করেন তাহলে Microsoft.Extensions.Hosting
(সংস্করণ 2.1.0+) আপনার কনসোল অ্যাপ্লিকেশন এবং asp.net কোর অ্যাপ্লিকেশন হোস্ট করার জন্য, আপনার সমস্ত কনফিগারেশনের সঙ্গে ইনজেকশনের হয় HostBuilder
s 'এর ConfigureAppConfiguration
এবং ConfigureHostConfiguration
পদ্ধতি। appsettings.json
পরিবেশ ও ভেরিয়েবল কীভাবে যুক্ত করবেন সে সম্পর্কে এখানে ডেমো রয়েছে :
var hostBuilder = new HostBuilder()
.ConfigureHostConfiguration(config =>
{
config.AddEnvironmentVariables();
if (args != null)
{
// enviroment from command line
// e.g.: dotnet run --environment "Staging"
config.AddCommandLine(args);
}
})
.ConfigureAppConfiguration((context, builder) =>
{
var env = context.HostingEnvironment;
builder.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
// Override config by env, using like Logging:Level or Logging__Level
.AddEnvironmentVariables();
})
... // add others, logging, services
//;
উপরের কোডটি সংকলনের জন্য আপনাকে এই প্যাকেজগুলি যুক্ত করতে হবে:
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.0" />
ASPNETCORE_ENVIRONMENT
তবে এটি প্রকৃতপক্ষে সেট হয় তবে context.HostingEnvironment.EnvironmentName
সঠিকভাবে সেট করা যায় না
new HostBuilder()
? সব কি HostBuilder
অভ্যন্তরীণভাবে করে না?
আমি ভুল করেছিলাম. আপনি ConfigurationBuilder
নেটকোর কনসোল অ্যাপ্লিকেশন থেকে নতুনটি ব্যবহার করতে পারেন ।
উদাহরণের জন্য https://docs.asp.net/en/latest/fundamentals/configration.html দেখুন ।
তবে, কেবলমাত্র অ্যাসনেট কোরের বাক্সের বাইরে নির্ভরতা ইঞ্জেকশন রয়েছে যাতে আপনার দৃ strongly়ভাবে কনফিগারেশন সেটিংস টাইপ করার ক্ষমতা নেই এবং সেগুলি ব্যবহার করে স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে হবে IOptions
।
Microsoft.Extensions.Options
এবং কল করুনservice.AddOptions();
ConfigureWebHostDefaults()
উদাহরণগুলির মধ্যে কলগুলি .চ্ছিক এবং কেবলমাত্র ওয়েব অ্যাপ্লিকেশনের জন্য।
এটি ডটনেট ২.x কোর কনসোল অ্যাপ্লিকেশনের জন্য এরকম কিছু:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
[...]
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var serviceProvider = new ServiceCollection()
.AddLogging(options => options.AddConfiguration(configuration).AddConsole())
.AddSingleton<IConfiguration>(configuration)
.AddSingleton<SomeService>()
.BuildServiceProvider();
[...]
await serviceProvider.GetService<SomeService>().Start();
আপনি ILoggerFactory মধ্যে IConfiguration উদ্বুদ্ধ পারে SomeService
।
নেট কোর 3.1 তে আমাদের কেবল এটি করা দরকার:
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
}
সেরিলগ ব্যবহার করে দেখতে দেখতে এটি দেখতে পাবেন:
using Microsoft.Extensions.Configuration;
using Serilog;
using System;
namespace yournamespace
{
class Program
{
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();
try
{
Log.Information("Starting Program.");
}
catch (Exception ex)
{
Log.Fatal(ex, "Program terminated unexpectedly.");
return;
}
finally
{
Log.CloseAndFlush();
}
}
}
}
এবং প্রতিদিন একটি ফাইল উত্পন্ন করার জন্য সেরিলোগ অ্যাপসটিং.জসন বিভাগটি দেখতে পাবেন:
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\\Logs\\Program.json",
"rollingInterval": "Day",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
}
}
]
}
আপনি এটির জন্য লাইটওয়্যার . কনফিগারেশন লাইব্রেরি ব্যবহার করতে পারেন । এটি নেট ফ্রেমওয়ার্ক মূলের সাথে খুব অনুরূপ ConfigurationManager
এবং। নেট কোর / স্ট্যান্ডার্ডের জন্য কাজ করে। কোড-ভিত্তিক, আপনি এরকম কিছু দিয়ে শেষ করবেন:
string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");
দাবি অস্বীকার: আমি লাইটওয়্যার.কনফিগারেশনের লেখক।
কেবল পাইলিং করা হচ্ছে ... ফিইউ চি'র পোস্টের মতো। এখানে আমি মেশিনের নাম যুক্ত করছি।
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
var env = context.HostingEnvironment;
var hostname = Environment.MachineName;
builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostname}.json", optional: true, reloadOnChange: true);
builder.AddEnvironmentVariables();
if (args != null)
{
builder.AddCommandLine(args);
}
})
.UseStartup<Startup>();
}
এই প্যাকেজগুলি ইনস্টল করুন:
কোড:
static void Main(string[] args)
{
var environmentName = Environment.GetEnvironmentVariable("ENVIRONMENT");
Console.WriteLine("ENVIRONMENT: " + environmentName);
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false)
.AddJsonFile($"appsettings.{environmentName}.json", true)
.AddEnvironmentVariables();
IConfigurationRoot configuration = builder.Build();
var mySettingsConfig = configuration.Get<MySettingsConfig>();
Console.WriteLine("URL: " + mySettingsConfig.Url);
Console.WriteLine("NAME: " + mySettingsConfig.Name);
Console.ReadKey();
}
মাইসেটেটিং কনফিগ ক্লাস:
public class MySettingsConfig
{
public string Url { get; set; }
public string Name { get; set; }
}
আপনার অ্যাপসেটিংগুলি এর চেয়ে সহজ হতে পারে:
এছাড়াও, নতুন হয়ে থাকলে অ্যাপসেটিং ফাইলগুলি সামগ্রী / অনুলিপিতে সেট করুন:
Directory.GetCurrentDirectory()
পরিবর্তে ব্যবহার করুনAppContext.BaseDirectory
। হ্যাকের পরে কোনও প্রয়োজন নেই।