2009-02-10 23 views
109

Về cơ bản vấn đề là mỗi lần phiên bản lắp ráp thay đổi (tức là người dùng cài đặt phiên bản mới của ứng dụng) tất cả các thiết lập của họ được đặt lại mặc định (hoặc chính xác hơn một tệp user.config mới được tạo trong một thư mục có số phiên bản khác nhau làm tên)Làm cách nào để giữ cài đặt user.config trên các phiên bản lắp ráp khác nhau trong .net?

Làm cách nào để giữ nguyên cài đặt tương tự khi nâng cấp phiên bản, vì việc sử dụng tệp ini hoặc đăng ký có vẻ không được khuyến khích?

Khi chúng tôi sử dụng Clickonce, dường như nó có thể xử lý việc này, vì vậy có vẻ như nó có thể được thực hiện, nhưng tôi không chắc chắn như thế nào.

+0

Chỉ cần các câu hỏi tôi cần thiết, nhờ :) –

+0

[Tương tự như câu hỏi] (http://stackoverflow.com/question/534119/semi-editable-files-eg-config-files-và-phiên bản-control-best-practices/534170)? –

+0

Không, đó là đề cập đến mặc định không kiểm tra tệp vào điều khiển phiên bản (hoặc vì vậy tôi đã thu thập được) Điều này liên quan đến (Windows) cài đặt dành riêng cho người dùng cho người dùng cuối – Davy8

Trả lời

172

ApplicationSettingsBase có method called Upgrade di chuyển tất cả các cài đặt từ phiên bản trước.

Để chạy hợp nhất bất cứ khi nào bạn xuất bản phiên bản ứng dụng mới, bạn có thể xác định cờ boolean trong tệp cài đặt mặc định là đúng. Đặt tên cho nó là UpgradeRequired hoặc tương tự. Sau đó, lúc bắt đầu ứng dụng, bạn kiểm tra xem cờ đã được đặt chưa và có đúng không, hãy gọi số Upgrade method, đặt cờ thành sai và lưu cấu hình của bạn.

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

Đọc thêm về phương pháp nâng cấp tại MSDN. GetPreviousVersion cũng có thể đáng xem nếu bạn cần thực hiện một số hợp nhất tùy chỉnh.

+4

Chỉ cần câu trả lời tôi cần, cảm ơn :) –

+1

Một câu hỏi nhỏ, điều gì cấu thành một phiên bản mới? Bất kỳ phần nào trong số 4 phần? Tôi sử dụng ClickOnce để một con vật khác? –

+3

Loại cài đặt nào nên ** UpgradeRequired **? 'appSettings',' userSettings' hoặc 'applicationSettings'? Là một thiết lập người dùng trên Settings.Settings, một khi lần đầu tiên nó được thay đổi thành false nó sẽ không bao giờ đúng nữa. Phiên bản mới sẽ không đặt lại ** UpgradeRequired ** thành True. – dialex

0

Nếu thay đổi của bạn đối với user.settings được thực hiện theo chương trình, cách duy trì một bản sao (chỉ) các sửa đổi đối với user.settings trong một tệp riêng biệt, ví dụ: user.customized.settings?

Bạn có thể vẫn muốn duy trì và tải các cài đặt đã sửa đổi trong user.settings. Nhưng theo cách này, khi bạn cài đặt phiên bản ứng dụng mới hơn với phiên bản mới hơn của user.settings, bạn có thể hỏi người dùng xem họ có muốn tiếp tục sử dụng cài đặt đã sửa đổi của họ hay không bằng cách sao chép chúng trở lại user.settings mới. Bạn có thể nhập chúng bán buôn, hoặc có được fancier và yêu cầu người dùng xác nhận cài đặt nào họ muốn tiếp tục sử dụng.

CHỈNH SỬA: Tôi đọc quá nhanh về phần "chính xác hơn" về các phiên bản lắp ráp khiến một user.settings mới được cài đặt vào một thư mục phiên bản mới cụ thể. Do đó, ý tưởng trên có thể không giúp bạn, nhưng có thể cung cấp một số thực phẩm cho sự suy nghĩ.

0

Đây là cách tôi xử lý nó:

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; 

}

và trong lớp cài đặt, tôi đã xác định tài sản IsDefault:

// 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; } 
} 

Trong SaveSettings, tôi đặt IsDefault thành false:

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(); 
} 
1

Tôi biết đã lâu rồi ... Trong ứng dụng winforms, chỉ cần gọi My.Settings.Upgrade() trước khi bạn tải chúng. Thao tác này sẽ nhận các cài đặt mới nhất, cho dù phiên bản hiện tại hay phiên bản trước đó.

0

Đây là nghiên cứu của tôi trong trường hợp bất kỳ ai khác gặp khó khăn trong việc di chuyển cài đặt đã bị thay đổi/xóa. Vấn đề cơ bản là GetPreviousVersion() không hoạt động nếu bạn đã đổi tên hoặc xóa cài đặt trong phiên bản ứng dụng mới của mình. Vì vậy, bạn cần phải giữ thiết lập trong lớp Settings của bạn, nhưng thêm một vài thuộc tính/hiện vật vào nó để bạn không vô tình sử dụng nó trong mã ở nơi khác, làm cho nó lỗi thời. Một khung cảnh trở nên lỗi thời mẫu sẽ trông như thế này trong VB.NET (có thể dễ dàng được dịch sang C#):

<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 

Hãy chắc chắn rằng bạn thêm thuộc tính này để cùng không gian tên/lớp có cài đặt ứng dụng của bạn. Trong VB.NET, lớp này có tên là MySettings và có sẵn trong không gian tên My. Bạn có thể sử dụng chức năng lớp học một phần để ngăn các cài đặt lỗi thời của bạn trộn lẫn với cài đặt hiện tại của bạn.

Toàn bộ tín dụng cho jsharrison để đăng một số excellent article về vấn đề này. Bạn có thể đọc thêm chi tiết về nó ở đó.

0

Dưới đây là một biến thể về các giải pháp được trình bày ở đây đóng gói logic nâng cấp thành lớp trừu tượng mà các lớp cài đặt có thể lấy được từ đó.

Một số giải pháp được đề xuất sử dụng thuộc tính DefaultSettingsValue để chỉ định giá trị cho biết thời điểm cài đặt trước đó không được tải. Sở thích của tôi là chỉ cần sử dụng một loại có giá trị mặc định cho biết điều này. Là tiền thưởng, một DateTime? là thông tin gỡ lỗi hữu ích.

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(); 
    } 
} 

xuất phát từ UserSettingsBase:

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

    public MySettings() : base() { } 
} 

Và sử dụng nó:

// Existing settings are loaded and upgraded if needed 
MySettings settings = new MySettings(); 
... 
settings.SomeSetting = "SomeValue"; 
... 
settings.Save(); 
Các vấn đề liên quan