7

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

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

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

顺便说一句,为此使用 C# 3.5。

4

3 回答 3

6

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

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

于 2008-09-17T05:25:37.983 回答
2

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

业务对象确实是大多数应用程序的“必经之路”。你正在潜入一个很深的领域,并且会有很多学习要做。查看 DDD。

我也强烈建议不要在你的代码隐藏中使用这样的代码。查看 MVP 模式。

我也(虽然我正在费心学习许多新的、非常关键的东西)研究 SOLID。

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

于 2008-09-17T05:41:37.227 回答
-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 的指导方针,这将带你走得更远......

于 2008-09-17T05:23:40.733 回答