7

個人のようなものを表すビジネス オブジェクトまたはエンティティを作成するという概念を理解しました。次に、DTO を使用して Person をシリアル化し、クライアントに送信します。クライアントがオブジェクトを変更した場合、そこに IsDirty フラグを設定できるため、オブジェクトがサーバーに送り返されたときに更新する必要があることがわかります。

しかし、Order オブジェクトがある場合はどうなるでしょうか? これには、主要なヘッダー情報、顧客、サプライヤー、必要な日付などが含まれます。次に、注文するアイテムである List< OrderItem> である OrderItems があります。UI でこのビジネス オブジェクトを使用できるようにしたいと考えています。そのため、場所、サプライヤー、必要な日付などに接続されたいくつかのテキスト ボックスと、OrderItems に接続されたグリッドがあります。OrderItems は List であるため、簡単にレコードを追加および削除できます。しかし、これ、特に削除されたアイテムを追跡するにはどうすればよいですか。削除されたアイテムをグリッドに表示したくないので、foreach を使用した場合、アイテムが削除されているため、それらを反復処理できないはずです。しかし、削除があったという事実を追跡する必要があります。変更を追跡するにはどうすればよいですか。作業単位を使用する必要があると思いますか? しかし、その後、コードは非常に複雑になるようです。では、単純に DataTables を使用して、無料で変更追跡を取得してみませんか? しかし、その後、ビジネスオブジェクトがどのように進むべきかを読みました.

Orders のようなヘッダー詳細の例ではなく、単純な Person の例でさまざまな例を見つけました。

ところで、これには 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を調べたいと思います。

これらの多くをカバーしているJPBoodhooの.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 に答える