4

我有一个允许人们编辑数据库中的数据的 winform,为了简化事情,假设数据库中有一个 Customer 表,其中包含 3 个字段 - 名称、城市、国家。通过 winform(s) 人们可以添加/编辑/删除客户。

对于这些操作中的每一个,我们需要保存:

  1. 字段名称是什么(在这种情况下为名称、城市、国家)

  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

我会做什么......制作几个课程。有一个“审计日志”的东西收集了一堆“审计记录”的东西。每个审计记录都是EditDelete,并包含已更改的记录和对象的旧值(如果适用)。

好的,因为将涉及多种对象类型(客户、产品、...),这对我来说意味着这些类型应该是通用的。

这让我想到:

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,但不再由微软推广。

  • 您有每个对象类型的数据表(在您的示例客户中)
  • 您有带有字段(名称、城市、国家/地区)的数据行
  • 有不同的行版本(原始,实际)
  • 您可以(de)将其序列化为 xml(WriteXml、LoadXml、GetXml)

您的描述中缺少的是用于指示已删除行的行状态。

于 2012-06-17T05:41:06.063 回答