如何跟踪业务对象的更改?

7
我理解创建一个业务对象或实体来代表像Person这样的东西的概念。然后我可以使用DTO序列化Person并将其发送到客户端。如果客户端更改了该对象,则可以在其中添加IsDirty标志,因此当它被发送回服务器时,我知道要更新它。
但是,如果我有一个Order对象呢?它具有主要的头信息,如客户、供应商、所需日期等。然后它有OrderItems,这是一个List < OrderItem >,表示要订购的商品。我想能够在我的UI中使用这个业务对象。因此,我将一些文本框连接到位置、供应商、所需日期等,并将一个网格连接到OrderItems。由于OrderItems是一个列表,我可以很容易地向其中添加和删除记录。但是,我如何跟踪这些,特别是已删除的项目。我不希望在我的网格中看到已删除的项目,并且如果我使用foreach迭代,我也不应该能够对它们进行迭代,因为它们已经被删除了。但我仍然需要跟踪有一个删除的事实。我该如何跟踪这些变化?我认为我需要使用工作单元?但是,代码似乎变得相当复杂。那么我想为什么不直接使用DataTable,获得免费的更改跟踪呢?但是后来我读到了业务对象是正确的方法。
我已经找到了一些关于简单Person示例的示例,但没有关于类似Orders的头-细节示例。
顺便说一下,我正在使用C# 3.5。
3个回答

6
首先,您可以使用现有的框架来解决这些问题,例如CSLA.NET。该框架的作者已经解决了这些问题。请访问http://www.rockfordlhotka.net/cslanet/。即使您不使用完整的框架,这些概念仍然适用。
如果您想自己编写代码,我过去所做的是,不使用List作为我的集合,而是使用从BindingList派生的自定义类型。从BindingList继承允许您重写添加/删除项的行为。因此,您可以例如拥有另一个内部集合来存储“已删除”的项。每次调用您的集合上重写的Remove方法时,将该项放入“已删除”集合中,然后调用Remove方法的基本实现。您也可以对添加的项或更改的项执行相同的操作。

2

你对需要一个工作单元的观点是正确的,但不要自己编写。使用NHibernate或其他ORM。这就是它们的用途。它们内置了工作单元。

对于大多数应用程序来说,业务对象确实是“前进的道路”。您正在深入研究领域,并且需要学习很多知识。请查看DDD。

我也强烈建议不要在代码后台中编写此类代码。请查看MVP模式。

同时(如果我要学习很多新的、高度关键的东西),我还会研究SOLID。

您可能需要查看JP Boodhoo的.NET课程,因为它涵盖了许多这些内容。


-1
数据对象不会跟踪更改。更改跟踪发生在 DataContext 和通过 DataContext 检索到的对象上。因此,为了跟踪更改,您需要执行以下操作:
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; }
}

现在你可以在你的代码后端做一些像这样的事情:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接