如何跟踪业务对象的更改?
Posted
技术标签:
【中文标题】如何跟踪业务对象的更改?【英文标题】:How to track changes to business objects? 【发布时间】:2010-09-09 23:02:16 【问题描述】:我得到了创建一个业务对象或实体来表示像一个人这样的东西的概念。然后我可以使用 DTO 序列化 Person 并将其发送给客户端。如果客户端更改了对象,它可以在那里有一个 IsDirty 标志,所以当它被发送回服务器时,我知道要更新它。
但是如果我有一个 Order 对象呢?这有主要的标题信息、客户、供应商、所需日期等。然后它有 OrderItems,它是一个 List
我在简单的 Person 示例中找到了各种示例,bnut 不是像 Orders 这样的标题细节示例。
顺便说一句,为此使用 C# 3.5。
【问题讨论】:
【参考方案1】:首先,您可以使用解决这些问题的现有框架,例如 CSLA.NET。这个框架的作者已经解决了这些问题。为此,请访问http://www.rockfordlhotka.net/cslanet/。即使您不使用完整的框架,这些概念仍然适用。
如果您想创建自己的,我过去所做的不是将 List 用于我的集合,而是使用从 BindingList 派生的自定义类型。从 BindingList 继承允许您覆盖添加/删除项目的行为。因此,例如,您可以拥有另一个“删除”项目的内部集合。每次在您的集合上调用覆盖的 Remove 方法时,将项目放入“已删除”集合中,然后调用 Remove 方法的基本实现。您可以对添加的项目或更改的项目执行相同的操作。
【讨论】:
【参考方案2】:你很清楚需要一个工作单元,但不要写一个。使用 NHibernate 或其他一些 ORM。这就是他们的目的。他们内置了工作单元。
业务对象确实是大多数应用程序的“必经之路”。你正在潜入一个很深的领域,并且会有很多学习要做。查看 DDD。
我还强烈建议不要在您的代码隐藏中使用这样的代码。研究 MVP 模式。
我也(虽然我正在费心学习许多新的、非常关键的东西)研究 SOLID。
您可能想查看 JP Boodhoo 的 .net 课程,因为它涵盖了很多此类内容。
【讨论】:
【参考方案3】:数据对象不跟踪更改。更改跟踪发生在 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 的指南,这将带您走得更远...
【讨论】:
以上是关于如何跟踪业务对象的更改?的主要内容,如果未能解决你的问题,请参考以下文章
Spring LTW+DDD实现业务数据变化的自动跟踪与回退