আপনার সেটিংসকে একটি ধ্রুবক পদ্ধতিতে আবদ্ধ করা একটি দুর্দান্ত ধারণা is
আমি যা করি সেটি সেটিংস ক্লাস তৈরি করা হয় হয় একটি স্থিতিশীল গ্লোবাল এক বা একাধিক উদাহরণ ক্লাস যা আমি তারপরে নির্ভরতা ইনজেকশন দিয়ে পরিচালনা করব। তারপরে আমি কনফিগারেশন থেকে সমস্ত সেটিংস শুরুতে ক্লাসে লোড করি।
আমি একটি ছোট লাইব্রেরিও লিখেছি যা এটি আরও সহজ করে তুলতে প্রতিবিম্বটি ব্যবহার করে।
একবার আমার সেটিংস আমার কনফিগার ফাইলে আসে
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Domain" value="example.com" />
<add key="PagingSize" value="30" />
<add key="Invalid.C#.Identifier" value="test" />
</appSettings>
</configuration>
আমি আমার প্রয়োজনের উপর নির্ভর করে একটি স্ট্যাটিক বা উদাহরণ ক্লাস করি। মাত্র কয়েকটি সেটিংস সহ সাধারণ অ্যাপ্লিকেশনগুলির জন্য একটি স্ট্যাটিক ক্লাস ভাল।
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
তারপরে আমার লাইব্রেরি কলটি ব্যবহার করুন Inflate.Static
অথবা Inflate.Instance
শীতল জিনিস হ'ল আমি কোনও মূল মান উত্স ব্যবহার করতে পারি।
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
এর জন্য সমস্ত কোড https://github.com/Enexure/Enexure.Fire.Configration এ গিটহাবে রয়েছে
এমনকি একটি নুগেট প্যাকেজ রয়েছে:
প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ সংযোজন.ফায়ার. কনফিগারেশন
রেফারেন্সের জন্য কোড:
using System;
using System.Linq;
using System.Reflection;
using Fire.Extensions;
namespace Fire.Configuration
{
public static class Inflate
{
public static void Static( Type type, Func<string, string> dictionary )
{
Fill( null, type, dictionary );
}
public static void Instance( object instance, Func<string, string> dictionary )
{
Fill( instance, instance.GetType(), dictionary );
}
private static void Fill( object instance, Type type, Func<string, string> dictionary )
{
PropertyInfo[] properties;
if (instance == null) {
// Static
properties = type.GetProperties( BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly );
} else {
// Instance
properties = type.GetProperties( BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly );
}
// Get app settings and convert
foreach (PropertyInfo property in properties) {
var attributes = property.GetCustomAttributes( true );
if (!attributes.Any( x => x is Ignore )) {
var named = attributes.FirstOrDefault( x => x is Named ) as Named;
var value = dictionary((named != null)? named.Name : property.Name);
object result;
if (ExtendConversion.ConvertTo(value, property.PropertyType, out result)) {
property.SetValue( instance, result, null );
}
}
}
}
}
}