关于c#:如何跟踪对业务对象的更改?

关于c#:如何跟踪对业务对象的更改?

How to track changes to business objects?

我有一个创建业务对象或实体以表示诸如Person之类的概念。然后,我可以使用DTO序列化Person并将其发送给客户端。如果客户端更改了对象,则可以在该对象上具有IsDirty标志,因此当它发送回我知道的服务器以对其进行更新时。

但是如果我有一个Order对象怎么办?它具有主要的标题信息,客户,供应商,所需日期等。然后具有OrderItems,它是List ,是要订购的项目。我希望能够在我的UI上使用此业务对象。因此,我有一些文本框与位置,供应商,所需日期等相关,并且还有一个网格与OrderItems相关。由于OrderItems是一个列表,因此我可以轻松地向其中添加和删除记录。但是我该如何跟踪,尤其是删除的项目。我不希望已删除的项目在网格中可见,并且如果我使用foreach,也应该无法对其进行迭代,因为它们已被删除。但是我仍然需要跟踪存在删除的事实。如何跟踪更改。我想我需要使用一个工作单元吗?但是随后,代码似乎变得非常复杂。因此,我想知道为什么不简单地使用DataTables并免费获得更改跟踪?但是随后,我了解了业务对象的发展方式。

我已经在简单的Person实例上找到了各种示例,而不是诸如Orders这类的标头详细信息示例。

BTW为此使用C#3.5。


首先,您可以使用解决这些问题的现有框架,例如CSLA.NET。这个框架的作者已经解决了这些问题。为此,请访问http://www.rockfordlhotka.net/cslanet/。即使您没有使用完整的框架,这些概念仍然适用。

如果您想自己动手制作,过去我所做的是使用集合从BindingList派生的自定义类型,而不是对集合使用List。从BindingList中进行插入允许您覆盖添加/删除项目的行为。因此,例如,您可以拥有另一个内部的"删除"项目。每次在您的集合上调用重写的Remove方法时,请将该项放入"已删除"集合中,然后调用Remove方法的基本实现。您可以对添加的项目或更改的项目执行相同的操作。


您会发现需要一个工作单元,但是不要写一个工作单元。使用NHibernate或其他一些ORM。那就是他们的目的。它们具有内置的工作单元。

对于大多数应用程序来说,业务对象确实是"必经之路"。您正潜入更深的领域,将会有很多要做的事情。查看DDD。

我也强烈建议您不要在后面的代码中使用类似的代码。查看MVP模式。

我也(在我不愿意学习很多新的,非常关键的事情的同时)研究SOLID。

您可能想查看JP Boodhoo的.net课程,因为它涵盖了很多这些内容。


数据对象不跟踪更改。更改跟踪发生在DataContext和您通过DataContext检索到的对象上。因此,为了跟踪更改,您需要执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class FooDataContext : DataContext
{
   public Table<Order> Orders;  
}

public class Order
{
    [DbColumn(Identity = true)]
    [Column(DbType ="Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id { get; set; }

    [DbColumn(Default ="(getutcdate())")]
    [Column(DbType ="DateTime", CanBeNull = false, IsDbGenerated = true)]
    public DateTime DateCreated { get; set; }

    [Column(DbType ="varchar(50)", CanBeNull = false, IsDbGenerated = false)]
    public string Name { get; set; }
}

现在在代码背后,您可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
public void UpdateOrder(int id, string name)
{
   FooDataContext db = new FooDataContext();
   Order order = db.Orders.Where(o=>o.Id == id).FirstOrDefault();

   if (order == null) return;

   order.Name = name;

   db.SubmitChanges();
}

我不建议直接在后面的代码中使用数据上下文,但这是使用Linq To SQL的好方法。我建议将所有数据库交互都放在一个外部项目中,并从GUI调用封装此行为的类。

如果您不熟悉Linq To Sql,我建议创建一个Linq To Sql(dbml)文件。

在解决方案资源管理器中右键单击您的项目,然后选择"添加新项"。选择Linq To SQL文件,然后它将使您连接到数据库并选择表。

然后您可以查看生成的代码,并获得有关Linq To Sql的工作原理以及如何使用它的一些好主意。

将其用作使用Linq to SQL的指南,这将使您走得更远...


推荐阅读

    金蝶担保机构业务管理系统

    金蝶担保机构业务管理系统,,1.金蝶财务软件怎么使用?软件使用方法 使用需要先登陆到数据库,可只导出V3数据或只导出最新年度数据。功能介绍

    2000元HP3005mt双核心业务平台

    2000元HP3005mt双核心业务平台,,HP Pro 3005系列,为中小型企业的商用台式机,坚持传统的商务电脑组装的风格。6月24日,惠普3005mt(le032pa)具有

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    北京交警电脑版|北京交警客户端下载

    北京交警电脑版|北京交警客户端下载,,1. 北京交警客户端下载网上举报车辆违章的APP有很多,每个地方推出的举报方式不一样,有的使用微信公众

    跟踪电脑意义|怎么追踪电脑

    跟踪电脑意义|怎么追踪电脑,,怎么追踪电脑  笔记本丢了,如果之前没有下载跟踪软件是不能找回来的,如果有下载的话就可以找回,但是要保证电