1

.NETに一連のカスタムXML構成管理クラスがあります。

私のアプリケーションには2つの構成スコープがあります。

ユーザー:この設定は、ユーザーがログインしているアカウントに関係なく、ユーザーに適用されます。ユーザーのディレクトリのXML構成ファイルに保存されます。

ユーザー/アカウント:この設定は、特定のアカウントにログインしたときにユーザーに適用されます。アカウント固有のサブディレクトリの下にあるユーザーのディレクトリのXML構成ファイルに保存されます。

2つのXMLドキュメントは同じ構造であり、手動で変更できます。アプリケーションが起動したら、ユーザーのプロファイルからXML構成を読み取り、ユーザー/アカウントディレクトリからXML構成を読み取ります。次に、2つのXMLドキュメントを1つのXDocumentにマージしてから、XMLをXDocumentのセクションをモデルにしたオブジェクトに逆シリアル化します。ユーザー/アカウントレベルの設定が存在する場合は、ユーザーレベルの設定を上書きする必要があります。例:

ユーザーファイル:

<FileSettings>
  <DownloadPath>C:\downloads</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
</FileSettings>

アカウントXYZのユーザー/アカウントファイル:

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
</FileSettings>

マージ後の結果:

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
</FileSettings>

上記の例では、2つのプロパティ(DownloadPathとUploadPath)を持つFileSettingsオブジェクトがセクションからインスタンス化されます。

これが私の問題です: DownloadPathとUploadPathがどの構成ファイル(つまりスコープ)から来たのかわかりません。その結果、オブジェクトを再度シリアル化する必要がある場合、どのプロパティがどのファイルに含まれるかがわかりません。

質問:「ソース」をプロパティごとに保存して、設定が読み取られたのと同じ構成ファイルに確実に書き込まれるようにするための最良の方法は何ですか?

ありがとう。

4

2 に答える 2

2

マージ後、各プロパティの値のソースを追加することはできますか?

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
  <DownloadPathSrc>xyz</DownloadPathSrc>
  <DownloadPathSrc>user</DownloadPathSrc>
</FileSettings>

その場合、2 つの src プロパティを FileSettings オブジェクトに逆シリアル化できます。ファイルに再度シリアル化する前に、*src プロパティを設定せずに、ソースごとに新しい FileSetting オブジェクトを作成できます。デフォルトでは、null 文字列はシリアル化されません。 XmlSerializer によって。src プロパティを使用すると、シリアル化するオブジェクトをどのファイルに保存するかがわかります。

編集、要素の属性としてsrcを追加する場合。それは実際に私の最初の考えでもありましたが、プロパティごとにクラスを作成する必要があります。たとえば、FileSetting クラスのプロパティ DownloadPath の場合

[XmlType()]
public class DownloadPath
{ 
  [XmlAttribute]
  public string Src;   
  [XmlText]
  public string Text;
}
// serialize to
<DownloadPath Src="...">text</DownloadPath>
于 2009-02-23T16:28:23.243 に答える
1

次のように、いくつかのプロパティを XML に追加したいと思います。

<FileSettings>
   <DownloadPath src="Account">C:\newlocation\xyz\mystuff</DownloadPath>
   <UploadPath src="User">C:\uploads</UploadPath>
</FileSettings>

コンテンツの分離レイヤーを実装する方が簡単です。

于 2009-02-23T17:00:20.033 に答える