关于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的指南,这将使您走得更远...


推荐阅读

    linux同步客户端命令?

    linux同步客户端命令?,时间,网络,服务,系统,认证,状态,管理,信息,分析,地址,l

    linux反序列化命令?

    linux反序列化命令?,状态,数据,情况,环境,网络,适当,下来,接口,对象,序列,序

    linux命令测试客户端?

    linux命令测试客户端?,地址,系统,网络,工具,工作,分析,环境,命令,下行,资料,l

    linux无效对象的命令?

    linux无效对象的命令?,软件,系统,单位,网络,管理,术语,检测,电脑,环境,风险,l

    linux做路由跟踪命令?

    linux做路由跟踪命令?,网络,系统,地址,设备,信息,电脑,工作,命令,服务,全球,l

    linux开启命令跟踪?

    linux开启命令跟踪?,系统,信息,软件,对比,工具,发行,通信,实时,状态,最新,如

    linux跟踪路由器命令?

    linux跟踪路由器命令?,网络,地址,系统,信息,情况,工具,时间,通信,命令,管理

    网络跟踪命令linux?

    网络跟踪命令linux?,网络,地址,工具,系统,时间,数据,下行,信息,设备,基础,lin

    linux跟踪网关命令?

    linux跟踪网关命令?,地址,网络,系统,信息,电脑,时间,设备,名字,命令,数据,在l

    安卓linux命令客户端?

    安卓linux命令客户端?,系统,软件,名字,设备,互动,服务,工具,基础,发展,代码,a

    安装客户端linux命令?

    安装客户端linux命令?,软件,中心,在线,发行,全国,公司,工作,国家,信息,命令,

    linux的跟踪路由命令?

    linux的跟踪路由命令?,信息,网络,系统,通信,命令,路由,指令,网关,两个,方法,

    linux跟踪命令工具?

    linux跟踪命令工具?,工具,系统,分析,信息,状态,综合,情况,环境,命令,数据,Lin

    linux客户端连接命令?

    linux客户端连接命令?,系统,地址,服务,工具,位置,基础知识,网络,工作,基础,

    路径跟踪命令linux?

    路径跟踪命令linux?,系统,地址,工作,设备,标准,信息,命令,概念,网络,数据,lin