2012-06-15 45 views
4

我有一个winform,允许人们从数据库中编辑数据,以简化事情假设有一个客户表在数据库中有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

我会做什么?产生了几个班。有一个“审计日志”收集了一系列“审计记录”。每个审计记录是编辑删除,并包含已更改的记录和对象的旧值(如果适用)。好吧,因为会涉及到多个对象类型(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

+0

感谢这一点,但我已经有一个类似的代码,我所寻找的是试图利用设计模式之一(可能或不可能).. – 03Usr

1

我还没有听说过一个特定的设计模式,在做什么,你在这里描述什么,但我会称之为脱机可更新数据库快照

如果我看了你的描述,你正确的描述,因为DOTNET 1.0什么dotnet dataset在做什么,仍然与VS2010/DOTNET 4.0工作,但不是由微软推动了。

  • 你必须为每个对象类型的DataTable(在你的例子客户)
  • 你有一个字段(名称,城市,国家)
  • 有不同的行版本(原件,实际)
  • 数据行
  • 可以的(de)它序列化到XML(中WriteXML,loadXML的,的getXML)

什么是你的描述缺失是RowState的可用于指示删除的行。

+0

感谢您的输入,你可能会正确的可能是没有一个特定的设计模式正在做我想要的。 – 03Usr