সি # - ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে ব্যবহারকারীর সেটিংস সংরক্ষণের জন্য দৃষ্টিভঙ্গি?


85

ডাব্লুপিএফ উইন্ডোজ (ডেস্কটপ) অ্যাপ্লিকেশনটিতে ব্যবহারকারীর সেটিংস ধরে রাখার জন্য আপনি কোন পদ্ধতির পরামর্শ দিচ্ছেন? নোট করুন যে ধারণাটি হল যে ব্যবহারকারী রান সময় তাদের সেটিংস পরিবর্তন করতে পারে এবং তারপরে অ্যাপ্লিকেশনটি বন্ধ করতে পারে, পরে অ্যাপ্লিকেশনটি শুরু করার পরে অ্যাপ্লিকেশনটি বর্তমান সেটিংস ব্যবহার করবে। কার্যকরভাবে তখন এটি প্রদর্শিত হবে যেন অ্যাপ্লিকেশন সেটিংস পরিবর্তন হয় না।

প্র 1 - ডাটাবেস বা অন্যান্য পদ্ধতির? আমার কাছে এমন একটি স্ক্লাইট ডাটাবেস আছে যা আমি যেভাবেই ব্যবহার করব তাই ডাটাবেসে একটি টেবিল ব্যবহার করা কোনও পদ্ধতির মতোই ভাল হতে পারে?

প্রশ্ন 2 - যদি ডাটাবেস: কোন ডাটাবেস টেবিল ডিজাইন? বিভিন্ন ধরনের তথ্য জন্য কলাম সহ এক টেবিলে এক আছে হতে পারে (যেমন string, long, DateTimeইত্যাদি) বা শুধু যার উপর আপনি ধারাবাহিকভাবে এবং ডি-ধারাবাহিকভাবে মান আছে মান জন্য একটি স্ট্রিং সঙ্গে একটি টেবিল? আমি ভাবছি প্রথমটি সহজ হবে, এবং যদি অনেক সেটিংস না থাকে তবে ওভারহেডটি বেশি হয় না?

প্রশ্ন 3 - এর জন্য অ্যাপ্লিকেশন সেটিংস ব্যবহার করা যেতে পারে? যদি তাই হয় তবে এখানে দৃ the়তা সক্ষম করার জন্য কোনও বিশেষ কাজ প্রয়োজন? এছাড়াও এই ক্ষেত্রে অ্যাপ্লিকেশন সেটিংস ডিজাইনারের "ডিফল্ট" মান ব্যবহার সম্পর্কিত কী ঘটবে? অ্যাপ্লিকেশন চালানোর মধ্যে সংরক্ষণ করা কোনও সেটিংস ডিফল্টরূপে ওভাররাইড হবে? (বা আপনার ডিফল্ট মানটি ব্যবহার করার দরকার নেই)


@ সমস্ত নতুন ব্যবহারকারীগণ যদি আপনার প্রশ্নগুলিকে এক সাথে যুক্ত করার পরিবর্তে পৃথক প্রশ্ন পোস্ট করতে পারেন তবে এটি পছন্দ করা হয়। এইভাবে, এটি আপনার প্রশ্নের উত্তর দেওয়ার লোকেদের এবং আপনার প্রশ্নের অন্তত একটি প্রশ্নের জন্য অন্যদের শিকার করতে সহায়তা করে। ধন্যবাদ!
হিল

উত্তর:


81

আপনি এটির জন্য অ্যাপ্লিকেশন সেটিংস ব্যবহার করতে পারেন , সেটিংস পড়তে এবং লিখতে সময় ব্যয় করা বিবেচনা করে ডাটাবেস ব্যবহার করা সেরা বিকল্প নয় (বিশেষত যদি আপনি ওয়েব পরিষেবা ব্যবহার করেন)।

এখানে কয়েকটি লিঙ্ক রয়েছে যা এটি কীভাবে অর্জন করতে হয় এবং ডাব্লুপিএফ এ সেগুলি কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করে -

ডাব্লুপিএফ ব্যবহারকারীর সেটিংস

দ্রুত ডাব্লুপিএফ টিপ: ডাব্লুপিএফ অ্যাপ্লিকেশন সংস্থান এবং সেটিংসকে কীভাবে আবদ্ধ করবেন?

ডাব্লুপিএফের জন্য একটি কনফিগারযোগ্য উইন্ডো


23

হালনাগাদ : আজকাল আমি জেএসএন ব্যবহার করব।

আমি ফাইল করতে সিরিয়ালাইজেশন সঙ্গে যেতে পছন্দ করি। এক্সএমএল ফাইলগুলি বেশিরভাগ সমস্ত প্রয়োজনীয়তার সাথে ফিট করে। আপনি ApplicationSettingsবিল্ড ইন ব্যবহার করতে পারেন তবে তাদের কিছু সীমাবদ্ধতা রয়েছে এবং একটি সংজ্ঞায়িত তবে (আমার জন্য) খুব অদ্ভুত আচরণ রয়েছে যেখানে তারা সঞ্চয় করেছিলেন। আমি তাদের প্রচুর ব্যবহার করেছি এবং তারা কাজ করে। তবে আপনি কীভাবে এবং কোথায় সঞ্চয় করেছিলেন তা যদি আপনি পুরো নিয়ন্ত্রণে রাখতে চান তবে আমি অন্য পদ্ধতির ব্যবহার করি।

  1. আপনার সমস্ত সেটিংস দিয়ে কোথাও একটি ক্লাস করুন। নাম দিয়েছিMySettings
  2. অধ্যবসায়ের জন্য সংরক্ষণ করুন এবং পড়ুন প্রয়োগ করুন
  3. এগুলি আপনার অ্যাপ্লিকেশন-কোডে ব্যবহার করুন

সুবিধাদি:

  • খুব সহজ পদ্ধতির।
  • সেটিংসের জন্য একটি ক্লাস। ভার. সংরক্ষণ.
  • আপনার সমস্ত সেটিংস প্রকারের নিরাপদ।
  • আপনি আপনার প্রয়োজন অনুসারে লজিককে সহজ বা প্রসারিত করতে পারেন (সংস্করণ, ব্যবহারকারী হিসাবে অনেক প্রোফাইল, ইত্যাদি)
  • এটি কোনও ক্ষেত্রে (ডাটাবেস, উইনফোর্ডস, ডাব্লুপিএফ, পরিষেবা, ইত্যাদি ...) খুব ভালভাবে কাজ করে)
  • এক্সএমএল ফাইলগুলি কোথায় সংরক্ষণ করতে হবে তা আপনি নির্ধারণ করতে পারেন।
  • আপনি এগুলি খুঁজে পেতে পারেন এবং কোড বা ম্যানুয়াল দ্বারা এগুলি পরিচালনা করতে পারেন
  • এটি কল্পনা করতে পারি যে কোনও স্থাপনার পদ্ধতির জন্য কাজ করে।

অসুবিধাগুলি: - আপনার সেটিংস ফাইলগুলি কোথায় সংরক্ষণ করতে হবে সে সম্পর্কে আপনাকে ভাবতে হবে। (তবে আপনি কেবল আপনার ইনস্টলেশন ফোল্ডারটি ব্যবহার করতে পারেন)

এখানে একটি সহজ উদাহরণ (পরীক্ষিত নয়) -

public class MySettings
{
    public string Setting1 { get; set; }
    public List<string> Setting2 { get; set; }

    public void Save(string filename)
    {
        using (StreamWriter sw = new StreamWriter(filename))
        {
            XmlSerializer xmls = new XmlSerializer(typeof(MySettings));
            xmls.Serialize(sw, this);
        }
    }
    public MySettings Read(string filename)
    {
        using (StreamReader sw = new StreamReader(filename))
        {
            XmlSerializer xmls = new XmlSerializer(typeof(MySettings));
            return xmls.Deserialize(sw) as MySettings;
        }
    }
}

এটি এখানে কীভাবে ব্যবহার করবেন তা এখানে। ডিফল্ট মানগুলি লোড করা বা ব্যবহারকারীর সেটিংস উপস্থিত রয়েছে কিনা তা পরীক্ষা করে ব্যবহারকারীর সেটিংসের সাথে সেগুলি ওভাররাইড করা সম্ভব:

public class MyApplicationLogic
{
    public const string UserSettingsFilename = "settings.xml";
    public string _DefaultSettingspath = 
        Assembly.GetEntryAssembly().Location + 
        "\\Settings\\" + UserSettingsFilename;

    public string _UserSettingsPath = 
        Assembly.GetEntryAssembly().Location + 
        "\\Settings\\UserSettings\\" + 
        UserSettingsFilename;

    public MyApplicationLogic()
    {
        // if default settings exist
        if (File.Exists(_UserSettingsPath))
            this.Settings = Settings.Read(_UserSettingsPath);
        else
            this.Settings = Settings.Read(_DefaultSettingspath);
    }
    public MySettings Settings { get; private set; }

    public void SaveUserSettings()
    {
        Settings.Save(_UserSettingsPath);
    }
}

কেউ এই পদ্ধতির দ্বারা অনুপ্রাণিত হতে পারে। আমি এখন অনেক বছর ধরে এটিই করি এবং এতে আমি বেশ খুশি।


4
অসুবিধার জন্য, এটি এমন হবে যে আপনার আর সেটিংস ডিজাইনার নেই, তাই উভয়ই যখন কাজ করবে তখন এটি কিছুটা কম ব্যবহারকারী বান্ধব।
ফিল 1970

4
সামগ্রিকভাবে "তারা যেখানে সংরক্ষণ করা হয় সেখানে খুব অদ্ভুত আচরণ" সম্পর্কে একমত হন, এর কারণে আমি আপনার পদ্ধতির অবিকল ব্যবহার করছি। +1
হ্যানিশ

আপনার যদি নতুন প্রশ্ন থাকে তবে প্রশ্ন জিজ্ঞাসা বোতামটি ক্লিক করে এটি জিজ্ঞাসা করুন
মাদুর

12

আপনি StringsXML হিসাবে আপনার সেটিংস তথ্য সংরক্ষণ করতে পারেন Settings.Default। আপনার কনফিগারেশন ডেটা সঞ্চয় করতে কিছু ক্লাস তৈরি করুন এবং তা নিশ্চিত করুন [Serializable]। তারপরে, নিম্নলিখিত সহায়কগুলির সাহায্যে আপনি এই বিষয়গুলির উদাহরণগুলি - বা List<T>(বা তাদের মধ্যে অ্যারে T[]ইত্যাদি) - তে ক্রমিক করতে পারেন StringSettings.Defaultআপনার ডাব্লুপিএফ অ্যাপ্লিকেশনগুলির নিজস্ব স্ব স্লটে এই বিভিন্ন স্ট্রিংগুলির প্রতিটি সংরক্ষণ করুন Settings

পরের বার অ্যাপ্লিকেশন শুরু হওয়ার পরে অবজেক্টগুলি পুনরুদ্ধার করতে Settings, আগ্রহের স্ট্রিংটি এবং Deserializeপ্রত্যাশিত প্রকারটি পড়ুন T(যা এই সময়টিকে অবশ্যই স্পষ্টভাবে টাইপ যুক্তি হিসাবে নির্দিষ্ট করা উচিত Deserialize<T>)।

public static String Serialize<T>(T t)
{
    using (StringWriter sw = new StringWriter())
    using (XmlWriter xw = XmlWriter.Create(sw))
    {
        new XmlSerializer(typeof(T)).Serialize(xw, t);
        return sw.GetStringBuilder().ToString();
    }
}

public static T Deserialize<T>(String s_xml)
{
    using (XmlReader xw = XmlReader.Create(new StringReader(s_xml)))
        return (T)new XmlSerializer(typeof(T)).Deserialize(xw);
}

6

এই প্রশ্নের দীর্ঘকাল ধরে চলতে থাকা সবচেয়ে সাধারণ পন্থা হ'ল: বিচ্ছিন্ন স্টোরেজ।

এক্সএমএল বা অন্য কোনও ফর্ম্যাটে আপনার নিয়ন্ত্রণের অবস্থাটি সিরিয়াল করুন (বিশেষত সহজেই যদি আপনি ডাব্লুপিএফের সাথে নির্ভরশীলতা সম্পত্তিগুলি সংরক্ষণ করেন) তবে ব্যবহারকারীর বিচ্ছিন্ন স্টোরেজে ফাইলটি সংরক্ষণ করুন।

আপনি যদি অ্যাপ্লিকেশন সেটিংয়ের রুটে যেতে চান তবে আমি নিজেই এক পর্যায়ে অনুরূপ কিছু চেষ্টা করেছিলাম ... যদিও নীচের পদ্ধতির সহজেই বিচ্ছিন্ন স্টোরেজটি ব্যবহারের জন্য রূপান্তর করা যেতে পারে:

class SettingsManager
{
    public static void LoadSettings(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
    {
        EnsureProperties(sender, savedElements);
        foreach (FrameworkElement element in savedElements.Keys)
        {
            try
            {
                element.SetValue(savedElements[element], Properties.Settings.Default[sender.Name + "." + element.Name]);
            }
            catch (Exception ex) { }
        }
    }

    public static void SaveSettings(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
    {
        EnsureProperties(sender, savedElements);
        foreach (FrameworkElement element in savedElements.Keys)
        {
            Properties.Settings.Default[sender.Name + "." + element.Name] = element.GetValue(savedElements[element]);
        }
        Properties.Settings.Default.Save();
    }

    public static void EnsureProperties(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
    {
        foreach (FrameworkElement element in savedElements.Keys)
        {
            bool hasProperty =
                Properties.Settings.Default.Properties[sender.Name + "." + element.Name] != null;

            if (!hasProperty)
            {
                SettingsAttributeDictionary attributes = new SettingsAttributeDictionary();
                UserScopedSettingAttribute attribute = new UserScopedSettingAttribute();
                attributes.Add(attribute.GetType(), attribute);

                SettingsProperty property = new SettingsProperty(sender.Name + "." + element.Name,
                    savedElements[element].DefaultMetadata.DefaultValue.GetType(), Properties.Settings.Default.Providers["LocalFileSettingsProvider"], false, null, SettingsSerializeAs.String, attributes, true, true);
                Properties.Settings.Default.Properties.Add(property);
            }
        }
        Properties.Settings.Default.Reload();
    }
}

.....এবং....

  Dictionary<FrameworkElement, DependencyProperty> savedElements = new Dictionary<FrameworkElement, DependencyProperty>();

public Window_Load(object sender, EventArgs e) {
           savedElements.Add(firstNameText, TextBox.TextProperty);
                savedElements.Add(lastNameText, TextBox.TextProperty);

            SettingsManager.LoadSettings(this, savedElements);
}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            SettingsManager.SaveSettings(this, savedElements);
        }

5

একটি ডাটাবেস ছাড়াও, আপনার ব্যবহারকারীর সম্পর্কিত সেটিংস সংরক্ষণের জন্য নিম্নলিখিত বিকল্পগুলি থাকতে পারে

  1. রেজিস্ট্রি অধীনে HKEY_CURRENT_USER

  2. AppDataফোল্ডারে একটি ফাইলে

  3. Settingsডাব্লুপিএফ-তে ফাইল ব্যবহার করে এবং এর স্কোপটিকে ব্যবহারকারী হিসাবে সেট করে


4
প্রস্তাবনা 1 হ'ল কারণগুলিতে অ্যাপ্লিকেশনগুলি উইন্ডোজকে ধীর করে দেয়, কোনও ফাইল আইএমওতে আরও ভাল কিছু করাতে রেজিস্ট্রি কীগুলি পূরণ করা ভাল।
কনসোল

4
@ কনসোল, একটি ডিস্কে ফাইল লেখার ফলে ধীরে ধীরে ডাউন হয়ে যায় (এসএসডি), ডাটাবেসে স্লো ডাউন ডাউন ডাটাবেসে ডেটা লেখা writing তাহলে আপনার বিকল্প কি? উইন্ডোজ রেজিস্ট্রি সেটিংস সংরক্ষণের জন্য এক জায়গা হিসাবে ব্যবহার করার উদ্দেশ্যে করা হয় ।
সিনাতর

4
আপনি ঠিক বলেছেন, আমি মনে করি এটি উল্লেখ করা জরুরী যে রেজিস্ট্রিটিতে কিছু ত্রুটি রয়েছে যদি প্রতিটি অ্যাপ্লিকেশন সেখানে অপ্রয়োজনীয় ব্যবহারকারীর পছন্দগুলি সংরক্ষণ করে।
কনসোল

@ সিনাটর মূলত, রেজিস্ট্রিটি সেই উদ্দেশ্যেই করা হয়েছিল ... তবে ইতিহাসের এক পর্যায়ে এটি প্রচুর পরিমাণে ডেটা হ্যান্ডেল করার নকশা করা হয়নি, মাইক্রোসফ্ট এটি ব্যবহার বন্ধ করার পরামর্শ দিয়েছে। যতদূর আমি জানি, উইন্ডোজ সম্পূর্ণ রেজিস্ট্রিটি লগনে লোড করে এবং রোমিংয়ের জন্য অনুলিপি তৈরি করে বা কোনও বড় ক্র্যাশের পরে সর্বশেষ পরিচিত ভাল কনফিগারেশন লোড করতে সক্ষম করে। সুতরাং অ্যাপ্লিকেশনটি কখনই ব্যবহার না করা হলেও রেজিস্ট্রি ব্যবহার করে সিস্টেমকে প্রভাবিত করে।
ফিল 1970

এছাড়াও রেজিস্ট্রি একটি আকার সীমা আছে এবং এটি প্রয়োগ দ্বারা এখনও ব্যবহার করা হয়, সম্ভবত সর্বাধিক কম্পিউটারে সীমা অতিক্রম করা হবে। রেজিস্ট্রি এমন সময়ে ডিজাইন করা হয়েছিল যেখানে কম্পিউটার বর্তমানে জিবিতে কম্পিউটারের চেয়ে এমবিতে কম মেমরি পেয়েছে। রেজিস্ট্রি এত বড় হওয়ার জন্য ডিজাইন করা হয়নি এবং এভাবে সীমাবদ্ধতা বৃদ্ধি পেয়েও এটি আমাদের বর্তমান প্রয়োজনের জন্য অনুকূল নয়।
ফিল 1970

3

আমার অভিজ্ঞতার মধ্যে একটি ডাটাবেস টেবিলের সমস্ত সেটিংস সংরক্ষণ করা সর্বোত্তম সমাধান। এমনকি পারফরম্যান্স নিয়েও চিন্তা করবেন না। আজকের ডাটাবেসগুলি দ্রুত এবং সহজেই একটি টেবিলে হাজার হাজার কলাম সংরক্ষণ করতে পারে। আমি এটি কঠিন উপায়ে শিখেছি - আমি সিরিলাইজ করার / ডিসেরায়ালাইজ করার আগে - দুঃস্বপ্ন। স্থানীয় ফাইল বা রেজিস্ট্রি এ এটি সংরক্ষণ করার একটি বড় সমস্যা আছে - আপনার অ্যাপ্লিকেশনটি সমর্থন করতে হলে এবং কম্পিউটারটি বন্ধ রয়েছে - ব্যবহারকারী এর সামনে নেই - আপনারা কিছুই করতে পারবেন না ... যদি সেটিংগুলি ডিবিতে থাকে - আপনি পারেন সেগুলিকে তুলনা করতে পারেন তা উল্লেখ না করে সেগুলি পরিবর্তন করে এবং লঙ্ঘন করেছে ....


এবং সংযোগ উপলভ্য না হলে এগুলি দূর থেকে সংরক্ষণ করাতেও একটি বড় সমস্যা রয়েছে ... অফলাইনে কাজ করার সময় অনলাইনে কাজ করার জন্য লিখিত অনেক অ্যাপ্লিকেশনের আদর্শ অভিজ্ঞতা কম থাকে বা কখনও কখনও এমন বাগ থাকে যা অফলাইনে কাজ না করার জন্য কিছু কার্যকারিতা তৈরি করে এমনকি এটি করা উচিত কীভাবে ডিভাইসটি ব্যবহৃত হয় "গুপ্তচরবৃত্তি" ব্যতীত অন্য কোনও প্রভাব ফেলবে না।
ফিল 1970

1

আমি সাধারণত একটি কাস্টম [ Serializable] সেটিংস শ্রেণি সংজ্ঞায়িত করে এবং কেবল এটি ডিস্কে সিরিয়ালাইজ করে এই ধরণের জিনিসটি করি। আপনার ক্ষেত্রে আপনি আপনার এসকিউএল ডাটাবেসে স্ট্রিং ব্লবের মতো সহজেই সঞ্চয় করতে পারেন।


0
  1. যে জায়গাগুলিতে আমি কাজ করেছি সেখানে অ্যাপ্লিকেশন সহায়তার কারণে ডাটাবেস বাধ্যতামূলক করা হয়েছে। অ্যাডাম যেমন বলেছিলেন, ব্যবহারকারী তার ডেস্কে না থাকতে পারে বা মেশিনটি বন্ধ থাকতে পারে, বা আপনি দ্রুত কারওর কনফিগারেশনটি পরিবর্তন করতে বা নতুন-যোগদানকারীকে একটি ডিফল্ট (বা দলের সদস্যের) কনফিগারেশন নির্ধারণ করতে চাইতে পারেন।

  2. অ্যাপ্লিকেশনটির নতুন সংস্করণ প্রকাশিত হওয়ার সাথে সাথে যদি সেটিংসটি বাড়ার সম্ভাবনা থাকে তবে আপনি ডেটাগুলি ব্লব হিসাবে সংরক্ষণ করতে পারেন যা অ্যাপ্লিকেশনটির দ্বারা পরে ডিজিট্রাইজড করা যেতে পারে। এটি বিশেষত কার্যকর যদি আপনি প্রিজমের মতো কিছু ব্যবহার করেন যা মডিউলগুলি আবিষ্কার করে, কারণ কোনও মডিউল কী সেটিংস ফিরে আসবে তা আপনি জানেন না। ব্লবগুলি ব্যবহারকারীর নাম / মেশিন সংমিশ্রণ কী দ্বারা কীড করা যায়। এইভাবে আপনার প্রতিটি মেশিনের জন্য আলাদা সেটিংস থাকতে পারে।

  3. আমি অন্তর্নির্মিত সেটিংস ক্লাসটি বেশি ব্যবহার করি নি তাই আমি মন্তব্য করা থেকে বিরত থাকব। :)


0

আমি আমার ভিবি.net ডেস্কটপ ডাব্লুপিএফ অ্যাপ্লিকেশনটির জন্য কোনও শ্রেণীর উপর ভিত্তি করে একটি এক্সএমএল নিয়ন্ত্রণ ফাইলটি ব্যবহার করতে চেয়েছিলাম। এই সমস্ত একসাথে করার জন্য উপরের কোডটি দুর্দান্ত এবং আমাকে সঠিক দিকে সেট করেছে। যদি কেউ এখানে কোনও ভিবি ডাইনে সমাধানের সন্ধান করে তবে আমি নির্মিত ক্লাসটি এখানে:

Imports System.IO
Imports System.Xml.Serialization

Public Class XControl

Private _person_ID As Integer
Private _person_UID As Guid

'load from file
Public Function XCRead(filename As String) As XControl
    Using sr As StreamReader = New StreamReader(filename)
        Dim xmls As New XmlSerializer(GetType(XControl))
        Return CType(xmls.Deserialize(sr), XControl)
    End Using
End Function

'save to file
Public Sub XCSave(filename As String)
    Using sw As StreamWriter = New StreamWriter(filename)
        Dim xmls As New XmlSerializer(GetType(XControl))
        xmls.Serialize(sw, Me)
    End Using
End Sub

'all the get/set is below here

Public Property Person_ID() As Integer
    Get
        Return _person_ID
    End Get
    Set(value As Integer)
        _person_ID = value
    End Set
End Property

Public Property Person_UID As Guid
    Get
        Return _person_UID
    End Get
    Set(value As Guid)
        _person_UID = value
    End Set
End Property

End Class
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.