আপনি কীভাবে। নেট এ বিভিন্ন সমাবেশ ভার্সন জুড়ে ব্যবহারকারীর কনফিগ সেটিংস রাখবেন?


146

মূলত সমস্যাটি হ'ল প্রতিটি সময় অ্যাসেম্বলি সংস্করণ পরিবর্তিত হয় (যেমন ব্যবহারকারী অ্যাপ্লিকেশনটির একটি নতুন সংস্করণ ইনস্টল করে) তাদের সমস্ত সেটিংস ডিফল্টগুলি পুনরায় সেট করা হয় (বা আরও সঠিকভাবে একটি নতুন সংস্করণ সহ একটি ফোল্ডারে একটি নতুন ইউজার.কমফিগ ফাইল তৈরি করা হয়) নাম হিসাবে নম্বর)

সংস্করণগুলি আপগ্রেড করার সময় আমি কীভাবে একই সেটিংস রাখতে পারি, যেহেতু আইএনআই ফাইল বা রেজিস্ট্রি ব্যবহার নিরুত্সাহিত বলে মনে হয়?

আমরা যখন ক্লিকনস ব্যবহার করলাম তখন মনে হয়েছিল এটি হ্যান্ডেল করতে সক্ষম হবে, সুতরাং এটি করার মতো হওয়া উচিত বলে মনে হয় তবে কীভাবে তা নিশ্চিত তা আমি নিশ্চিত নই।



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

আমার যে প্রশ্নটি প্রয়োজন, ধন্যবাদ :)
বাইনারি ওয়ারিয়ার

আমি নিম্নলিখিত থ্রেডে একটি সম্ভাব্য সমাধান পোস্ট করেছি: stackoverflow.com/a/47921377/3223783 আশা করি এটি সাহায্য করে!
dontbyteme

আমি এই থ্রেডে একটি সম্ভাব্য সমাধান পোস্ট করেছি । আশা করি এইটি কাজ করবে!
dontbyteme

উত্তর:


236

অ্যাপ্লিকেশনসেটিংসবেজে আপগ্রেড নামে একটি পদ্ধতি রয়েছে যা পূর্ববর্তী সংস্করণ থেকে সমস্ত সেটিংস স্থানান্তর করে।

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

তারপরে, অ্যাপ্লিকেশন শুরুতে আপনি পতাকাটি সেট করা আছে কিনা তা পরীক্ষা করে দেখুন এবং এটি যদি হয় তবে আপগ্রেড পদ্ধতিটি কল করুন , পতাকাটিকে মিথ্যাতে সেট করুন এবং আপনার কনফিগারেশনটি সংরক্ষণ করুন।

if (Settings.Default.UpgradeRequired)
{
    Settings.Default.Upgrade();
    Settings.Default.UpgradeRequired = false;
    Settings.Default.Save();
}

এমএসডিএন- তে আপগ্রেড পদ্ধতি সম্পর্কে আরও পড়ুন । GetPreviousVersion একটি বর্ণন মূল্য যদি আপনি কিছু কাস্টম মার্জ করতে প্রয়োজন হতে পারে।


2
একটি ছোট প্রশ্ন, একটি নতুন সংস্করণ গঠন কি? কোন অংশ 4 অংশ নম্বর? আমি ক্লিকঅনস ব্যবহার করি তাই অন্য কোন প্রাণী?
পাল্টানো পালাদিন

4
কোন ধরণের সেটিংস আপগ্রেড হওয়া উচিত ? appSettings, userSettingsবা applicationSettings? সেটিংসে ব্যবহারকারী সেটিংস হিসাবে S সেটিংগুলি, প্রথমবার এটি একবার মিথ্যাতে পরিবর্তিত হলে তা আর কখনও সত্য হবে না। একটি নতুন সংস্করণ এমনটি পুনরায় সেট করবে না যা পুনরায় আপগ্রেড করা হয়েছে সত্যটিতে ফিরে।
ডায়ালাক্স

4
@ ডায়ালেক্স এটি অবশ্যই একটি ব্যবহারকারী সেটিং হতে হবে। প্রকারের অ্যাপ্লিকেশনগুলির সেটিংস কেবল পঠনযোগ্য। নতুন সংস্করণ নম্বরগুলির কারণে সেটিংসটি রিসেট হয়ে যায় কারণ সেটিংসটি কোনও সংস্করণ-নির্দিষ্ট পথে সঞ্চিত থাকে।
লিওনার্ড থিয়ে

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

1
আমি কিছুটা অবাক হয়েছি যে এটি কেবল ডিফল্ট আচরণ নয়; যদি অ্যাপ্লিকেশনটির সেটিংস শুরুতে বাতিল হয় এবং এটি সেটিংসের আগের গোছা খুঁজে পায়, এটি সেগুলি লোড করে।
স্টিভসিংক

3

আমি জানি কিছুক্ষণ হয়ে গেছে ... একটি উইনফর্মস অ্যাপ্লিকেশনে, My.Settings.Upgrade()সেগুলি লোড করার আগে কেবল কল করুন। এটি সর্বশেষতম সেটিংস পাবে, বর্তমান সংস্করণ বা পূর্ববর্তী সংস্করণ।


2

অন্য যে কেউ স্থানান্তরিত সেটিংস পরিবর্তন করা / অপসারণ করা নিয়ে কঠোর সময় পারছে সে ক্ষেত্রে আমার গবেষণাটি এখানে। মূল সমস্যাটি হ'ল GetPreviousVersion()যদি আপনি আপনার অ্যাপ্লিকেশনটির নতুন সংস্করণে নামটি পরিবর্তন করে বা সেটিংটি সরিয়ে ফেলে থাকেন তবে তা কাজ করে না। সুতরাং আপনার সেটিংটি আপনার Settingsক্লাসে রাখা দরকার , তবে এটিতে কয়েকটি বৈশিষ্ট্য / শৈলী যুক্ত করুন যাতে আপনি অজান্তেই অন্য কোথাও কোডটিতে ব্যবহার না করে এটি অচল করে ফেলে। একটি নমুনা অপ্রচলিত সেটিংটি ভিবি.এনইটি-তে এটির মতো দেখায় (সহজেই সি # তে অনুবাদ করা যায়):

<UserScopedSetting(),
DebuggerNonUserCode(),
DefaultSettingValue(""),
Obsolete("Do not use this property for any purpose. Use YOUR_NEW_SETTING_NAME instead."),
NoSettingsVersionUpgrade()>
Public Property OldSettingName() As String
  Get
    Throw New NotSupportedException("This property is obsolete")
  End Get
  Set
    Throw New NotSupportedException("This property is obsolete")
  End Set
End Property

নিশ্চিত হয়ে নিন যে আপনি এই সম্পত্তিটিকে একই নামের স্থান / শ্রেণিতে যুক্ত করেছেন যাতে আপনার অ্যাপ্লিকেশন সেটিংস রয়েছে। ভিবি.এনইটি-তে, এই শ্রেণীর নামকরণ করা হয়েছে MySettingsএবং Myনামস্থানটিতে এটি উপলব্ধ । আপনার অপ্রচলিত সেটিংসকে আপনার বর্তমান সেটিংসের সাথে মিশ্রিত হতে আটকাতে আপনি আংশিক শ্রেণীর কার্যকারিতা ব্যবহার করতে পারেন।

এই সমস্যাটি সম্পর্কে একটি দুর্দান্ত নিবন্ধ পোস্ট করার জন্য জশারিসনকে সম্পূর্ণ কৃতিত্ব । আপনি এটি সম্পর্কে আরও বিশদ পড়তে পারেন।


1

এখানে উপস্থাপিত সমাধানগুলির জন্য এখানে একটি প্রকরণ রয়েছে যা সেটিংস ক্লাসগুলি গ্রহণ করতে পারে এমন একটি বিমূর্ত শ্রেণিতে আপগ্রেড যুক্তিকে আবদ্ধ করে।

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

public abstract class UserSettingsBase : ApplicationSettingsBase
{
    public UserSettingsBase() : base()
    {
        // Accessing a property attempts to load the settings for this assembly version
        // If LastSaved has no value (default) an upgrade might be needed
        if (LastSaved == null)
        {
            Upgrade();
        }
    }

    [UserScopedSetting]
    public DateTime? LastSaved
    {
        get { return (DateTime?)this[nameof(LastSaved)]; }
        private set { this[nameof(LastSaved)] = value; }
    }

    public override void Save()
    {
        LastSaved = DateTime.Now;
        base.Save();
    }
}

ইউজারসেটেটিংবেস থেকে প্রাপ্ত:

public class MySettings : UserSettingsBase
{
    [UserScopedSetting]
    public string SomeSetting
    {
        get { return (string)this[nameof(SomeSetting)]; }
        set { this[nameof(SomeSetting)] = value; }
    }

    public MySettings() : base() { }
}

এবং এটি ব্যবহার করুন:

// Existing settings are loaded and upgraded if needed
MySettings settings = new MySettings();
...
settings.SomeSetting = "SomeValue";
...
settings.Save();

0

ইউজার.সেটেটিং-এ আপনার পরিবর্তনগুলি যদি প্রোগ্রামিকভাবে করা হয়, তবে আলাদা ফাইলের ব্যবহারকারীর সেটিংসের (জাস্ট) পরিবর্তনের অনুলিপি বজায় রাখার বিষয়ে কীভাবে?

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

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


0

এইভাবেই আমি এটি পরিচালনা করেছি:

public virtual void LoadSettings(ServiceFileFormBaseSettings settings = null, bool resetSettingsToDefaults = false)
{
    if (settings == null)
            return;

    if (resetSettingsToDefaults)
        settings.Reset();
    else
    {
        settings.Reload();

        if (settings.IsDefault)
            settings.Upgrade();
    }

    this.Size = settings.FormSize;

}

এবং সেটিংস ক্লাসে, আমি ইসডেফল্ট সম্পত্তিটি সংজ্ঞায়িত করেছি:

// SaveSettings always sets this to be FALSE.
// This will have the default value TRUE when first deployed, or immediately after an upgrade.
// When the settings exist, this is false.
//
[UserScopedSettingAttribute()]
[DefaultSettingValueAttribute("true")]
public virtual bool IsDefault
{
    get { return (bool)this["IsDefault"]; }
    set { this["IsDefault"] = value; }
}

সেভসেটেটিংগুলিতে, আমি ইসডাফল্টকে মিথ্যাতে সেট করেছি:

public virtual void SaveSettings(ServiceFileFormBaseSettings settings = null)
{
    if (settings == null) // ignore calls from this base form, if any
        return;

    settings.IsDefault = false;
    settings.FormSize = this.Size;
    settings.Save();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.