4

私は、データベースのデータを編集できるWinFormを持っています。これは、名前、都市、国の3つのフィールドを持つCustomerテーブルがデータベースにあると仮定して単純化するためです。WinFormを介して、顧客を追加/編集/削除できます。

これらのアクションのそれぞれについて、保存する必要があります。

  1. フィールド名は何ですか(この場合はName、City、Country)

  2. 変更前のフィールド値は何でしたか

  3. 変更後のフィールド値は何ですか。

アクションが追加または削除の場合、2と3は同じになります。

XMLSerialisationを使用して(ただし、デザインパターンを使用せずに)これをすでに実装しており、XML出力は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<ActivityItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserID>26</UserID>
  <FormTitle>frmCustomer</FormTitle>
  <Action>Edit</Action>
  <Area>Customers</Area>
  <TrackedActivity>
    <FieldNames>
      <string>Name</string>
      <string>City</string>
      <string>Country</string>
    </FieldNames>
    <PreValues>
      <string>CompA</string>
      <string>London</string>
      <string>UK</string>
    </PreValues>
    <PostValues>
      <string>CompB</string>
      <string>Manchester</string>
      <string>UK</string>
    </PostValues>
  </TrackedActivity>
  <DateTimeStamp>2012-06-15T10:16:18</DateTimeStamp>
</ActivityItem>

このソリューションは、フィールドの数が異なるシステムのさまざまな領域を処理できます(つまり、たとえば製品を変更する場合も同じことが機能します)。

私の質問は、この種の動作に対処するための明確に定義されたデザインパターンはありますか?

どうもありがとう

4

2 に答える 2

4

私がすること...いくつかのクラスを作成します。たくさんの「監査記録」を収集する「監査ログ」があります。各監査レコードは、編集または削除のいずれかであり、変更されたレコードと、該当する場合はオブジェクトの古い値が含まれます。

わかりました。複数のオブジェクトタイプ(Customer、Productなど)が関係するため、これらのタイプは汎用である必要があると私に言います。

これは私に次のことをもたらします:

public class AuditLog<T>
{
    public int UserID   { get; set; }
    public string LastSaved   { get; set;}

    [XmlArrayItem("Entry")]
    public List<AuditRecord<T>> Records;
}

public enum Flavor
{
    Edit,
    Delete
}

public class AuditRecord<T>
{
    public AuditRecord() { Stamp = DateTime.Now; }

    [XmlAttribute("action")]
    public Flavor Action  { get; set;}

    [XmlAttribute("stamp")]
    public DateTime Stamp   { get; set;}

    public T Before;
    public T After; // maybe null
}

そして、このようなクラスのために

public class Customer
{
    public string Name   { get; set; }
    public string City   { get; set; }
    public String Country   { get; set; }
}

...次のようなドキュメントが表示されます。

<AuditLogOfCustomer>
  <UserID>0</UserID>
  <LastSaved>2012 Jun 16 20:42:53</LastSaved>
  <Records>
    <Entry action="Edit" stamp="2012-06-16T20:42:52.9622344-07:00">
      <Before>
        <Name>Sheldon</Name>
        <City>Ipswich</City>
        <Country>UK</Country>
      </Before>
      <After>
        <Name>Sheldon</Name>
        <City>London</City>
        <Country>UK</Country>
      </After>
    </Entry>
    <Entry action="Delete" stamp="2012-06-16T20:42:52.9642345-07:00">
      <Before>
        <Name>Sheldon</Name>
        <City>London</City>
        <Country>UK</Country>
      </Before>
    </Entry>
  </Records>
</AuditLogOfCustomer>

コード: http: //pastebin.com/PKiEefnX

于 2012-06-17T03:43:43.067 に答える
1

ここで説明したことを実行する特定のデザインパターンについてはまだ聞いたことがありませんが、オフラインで更新可能なデータベーススナップショットと呼びます。

私があなたの説明を正しく読んだら、あなたはdotnetデータセットがdotnet 1.0以来何をしていて、vs2010 / dotnet 4.0でまだ動作しているが、もはやマイクロソフトによって宣伝されていないかを説明します。

  • すべてのオブジェクトタイプ(顧客の例)のデータテーブルがあります
  • フィールド(名前、都市、国)を持つデータ行があります
  • 異なる行バージョンがあります(元の、実際の)
  • xml(WriteXml、LoadXml、GetXml)に(de)シリアル化できます

説明に欠けているのは、削除された行を示すために使用できるrowstateです。

于 2012-06-17T05:41:06.063 に答える