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

时间:2008-09-17 05:05:42

标签: c# business-objects

我得到了创建业务对象或实体以表示类似Person的概念。然后我可以使用DTO序列化Person并将其发送给客户端。如果客户端更改了对象,它可以在那里有一个IsDirty标志,所以当它被发送回服务器时,我知道要更新它。

但是如果我有一个Order对象怎么办?这具有主标题信息,客户,供应商,所需日期等。然后它具有OrderItems,其是List< OrderItem>,是要订购的商品。我希望能够在我的UI上使用此业务对象。所以我有一些文本框连接到位置,供应商,所需日期等,并且网格连接到OrderItems。由于OrderItems是一个List,我可以轻松地添加和删除记录。但是如何跟踪这一点,特别是删除的项目。我不希望删除的项目在我的网格中可见,如果我使用foreach,我不应该迭代它们,因为它们已被删除。但是我仍然需要跟踪删除的事实。如何跟踪更改。我想我需要使用一个单位的工作?但随后代码似乎变得相当复杂。那么我想知道为什么不简单地使用DataTables并免费获得更改跟踪?但后来我读到了业务对象是如何实现的。

我在简单的Person示例中找到了各种示例,bnut不是像Orders这样的标题详细示例。

BTW使用C#3.5。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

你需要一个单位的工作,但不要写一个。使用NHibernate或其他一些ORM。这就是他们的目标。他们有内置的工作单元。

对于大多数应用程序来说,业务对象确实是“可行的方法”。你潜入了一个很深的区域,会有很多学习要做。看看DDD。

我还强烈反对在代码隐藏中使用类似的代码。看看MVP模式。

我也(在我忙于学习许多新的,非常关键的事情的时候)看看SOLID。

你可能想看看JP Boodhoo除了.net课程外什么都没有。因为它涵盖了很多这些东西。

答案 2 :(得分:-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的指南,这将带你走远......