2011-01-03 1 views
0

私はC#で作業しています。自分のソフトウェアのバージョンをアップグレードするときにテストできるようにディスクに保存されたソフトウェアにカスタムの "設定"オブジェクトがあります。保存された設定のアップグレードパスのテスト

たとえば、ソフトウェアに「バージョンA」があり、そのバージョンの設定がある場合、ソフトウェアの「バージョンB」にアップグレードするときに、「設定A」をきれいにアップグレードできるようにしたいと考えています。

後で自分のソフトウェアの「バージョンC」にアップグレードすると、A-> CとB-> Cのアップグレードパスをテストする必要があります(バージョンn + 1では、 nした)。

私が気になるのは、テストパスの指数関数的な増加がすぐに維持しにくくなることです。

これに対処する標準的な方法はありますか?私が持っている


いくつかの重要な問題は、次のとおりです。

設定は必ずしもローカルコンピュータに保存されていないので、私は必要性を継承したソフトウェアは、コンピュータからコンピュータにこれらの設定を転送できるようにします。

MSDNでは、ClickOnceの設定ではこれを直接サポートしていないとしており、「自分のカスタム設定クラスを開発してリモートコンピュータに保存する」必要があります。

+0

実際にインストール/アップグレード時にこれを行う必要がありますか?アップグレード後に初めてアプリケーションを実行したときの設定のアップグレードはどうですか?この方法はずっと簡単です。 – Jay

答えて

2

アップグレード後にアプリケーションを最初に実行したときにこれを行う可能性があるというコメントを追加しました。

これらのアップグレードパスをすべて開発しなければならない場合や、この統合をインストール/アップグレード手順に組み込む必要がある場合は、私には分かりません。

問題はますます数多くの設定のアップグレードを構築し、テストする方法である場合は、それを行うためのシンプルな、比較的簡単な方法はこれです:だから

public interface ISettingsUpgrader 
{ 
    void UpgradeSettings(); 
} 

public abstract class SettingsUpgrader : SettingsUpgrader 
{ 
    protected int version; 

    public virtual void UpgradeSettings() 
    { 
     // load settings and read version info 
     version = settingsVersion; 
    } 
} 

public class SettingsUpgraderV2 : SettingsUpgrader 
{ 
    public override void UpgradeSettings() 
    { 
     base.UpgradeSettings(); 
     if(version > 1) return; 

     // do the v1 -> v2 upgrade 
    } 
} 

public class SettingsUpgraderV3 : SettingsUpgraderV2 
{ 
    public override void UpgradeSettings() 
    { 
     base.UpgradeSettings(); 
     if(version > 2) return; 

     // do the v2 -> v3 upgrade 
    } 
} 

は、それぞれの新しいバージョンのために、あなただけに持っていますこの規則に従い、以前のバージョンからのアップグレードを実装してください。すべての基本設定ファイルの処理は、基本抽象クラスで行われ、必要に応じて連続したアップグレードが実行されます。

テストごとに新しいバージョンを作成するには、(1)ベースメソッドが呼び出されていること(既存のテストによってその機能がすでにカバーされていること、および(2)最新のv(n-1) > v(n)が正しく実行される。

さらに、以前のバージョンにロールバックすることを禁止していない限り、各レベルで設定ロールバック手順を実装するのがよいでしょう。

+0

+1シンプルだが強力な解決策 – k3b

2

インストーラは通常、管理者権限を使用して実行する必要があり、通常はネットワークにアクセスする必要があります。あなたがする必要があるのは、現在のバージョンのapp config(またはそのようにした場合はレジストリキー)にアクセスしてファイルの場所を取得し、FileStreamを使用してローカルのcomp、ローカルサーバー、または企業のサーバーであれば、LAN/WAN経由で行うことができます。インターネットアドレスからプルするには、別のメカニズムが必要です。

私が行うことは、コンバージョンをレイヤリングすることです。設定ファイルをAからDに変換するには、最初にB、C、THENをDに変換します。これはパフォーマンスの悪いと思われるかもしれませんが、ユーザーが古くなったバージョンのソフトウェア;以前のバージョンからの定期的な更新は、1つのレイヤーを通過するだけで済みます。また、各レイヤーを閉じて変更するという極端な利点もあります。バージョンAをバージョンBに正しく変換するコードを取得したら、バージョンCの更新ロジックを追加するために戻ってこないでください。

+0

あなたの答えを読んでください。私のものはあなたのものにとても近いので、+1 – NotMe

1

アップグレードを処理する最善の方法は、一度に1ステップずつ行うことです。あなたの例を取ると

: あなたがCにB、その後、最初のBに実行する必要がありますにCからのアップグレードをテストする場合はBからCの

に1その後、からBへのアップグレードパスを構築

これはテストシナリオをかなり制限します。私が見たソフトウェアの多くは、このようにアップグレードを行います。テーブルにフィールドを追加して(Bへのアップグレード)フィールドをただちに削除する(Cにアップグレードする)ようなことが起こるかもしれません。シナリオを制限するために支払うべき小さな値段です。

最後に、直前のバージョンから現在のバージョンにアップグレードするためのアップグレードスクリプトを作成するだけです。

関連する問題