5

C# で製品販売業者向けのアプリケーションを開発しているとします。

ディストリビューターは、次の 3 種類の取引を行います。

(1) インデント

(2) 売却

(3)在庫

私は次のようにクラスを設計しています:

public abstract class Transaction
{
}

public class Indent : Transaction
{
}

public class Sell : Transaction
{
}    

public class Stock : Transaction
{
}

これら 3 種類の情報を 3 つの別々のテーブルに保存したい場合、DA レイヤーをどのように設計すればよいでしょうか?

次のような個別のDAクラスを構築する必要があります

(1) IndentDA
(2) SellDA
(3) StockDA

または単一のクラスで、演算子TransactionDAを使用して型をチェックして CRUD 操作を実行しas/isますか?

または、他に何ができますか?助言がありますか?

4

7 に答える 7

5

まず、単一クラスの TransactionDA を作成し、クラス内の型をチェックして CRUD 操作を実行すると、Open/Closed Principleに違反することになるため、その道をたどることは絶対にありません。

DAL を構築する方法に関する提案については、私よりもはるかに頭の良い人々がこのトピックについてどう考えているかについてのブログ投稿をフォローすることをお勧めします。

リポジトリは新しいシングルトンです

リポジトリは死んでいます: ロング ライブ リポジトリ

ナイト オブ ザ リビング レポジトリ

会話は続くと思いますが、それで始められるはずです。

于 2009-06-16T12:25:13.120 に答える
3

NHibernateなどのORMを使用し、そのマルチテーブル継承機能を使用すれば、自分で心配する必要はありません。

于 2009-06-16T12:38:41.283 に答える
3

ここではエンティティサブタイプを使用します。トランザクション用に1つのテーブルを作成し(以前のポスターで述べたように、おそらく別の用語の方が良いでしょう)、そこに共通するすべてのものを保存します。次に、専門分野ごとに1つの「サブタイプ」テーブルを作成します。これらのサブタイプテーブルには、メインテーブル(「強力な」エンティティ)と同じ主キーと、その特定の専門分野に固有のフィールドが必要です。各サブタイプは、1対1の方法で強力なエンティティに関連付けられており、サブタイプ側でのオプションの参加と、強力なエンティティ側での必須の参加があります。

次に、クエリを簡単にするために、(外部)が強力なエンティティをすべてのエンティティサブタイプと結合するビューを定義して、すべてを簡単に「表示」できるようにします。

これを設定する方法の簡単な(そして一般的な)例を次に示します。

create table Employee (
  eid        int primary key,
  first_name text,
  last_name  text not null
)

create table Salaried (
  eid             int primary key,
  annualSalaryUSD money not null
)

create table Hourly (
  eid             int primary key,
  hourlyRateUSD   money not null
)  
于 2009-06-16T12:33:08.720 に答える
2

データが 3 つの個別のテーブルに格納されることがわかっている場合、通常は 3 つの個別の DA クラスを使用します。

ただし、テーブルがほとんど同じである場合は、TransactionDA を汎用化し、データ層を簡素化できます。大量のトランザクションが発生し、テーブルを別のファイルなどに分割することがわかっている場合にのみこれを行います。それ以外の場合は、単純化してすべてを組み合わせるだけです。

すべての個別のトランザクション タイプが非常に類似していない限り、TransactionDA を作成しようとしないでください。

于 2009-06-16T12:24:53.150 に答える
2

依存性注入を使用して、それぞれに DA クラスを作成し、それらすべてに同じインターフェイス ITransactionDA を CRUD 操作で実装させることができます。

public interface ITransactionDA
{
  void Read();
  void Update();
...
}

public class StockDA : ITransactionDA
{
  //implement interface methods
}

Stock stock = new Stock(new StockDA());
于 2009-06-16T12:26:02.790 に答える
0

私はそのようなことをします

public abstract class DistributerTransaction
{
    DistributerDA dataaccess;
}
public class Indent : DistributerTransaction
{
}
public class Sell : DistributerTransaction
{
}
public class Stock : DistributerTransaction
{
}

public abstract class DistributerDA
{
   /*Read();
     Update();*/
}
public class IndentDA : DistributerDA
{
}
public class SellDA : DistributerDA
{
}
public class StockDA : DistributerDA
{
}
于 2009-06-16T12:35:00.930 に答える
-6

4 つのデザイン パターンのギャングをチェックしてください。

于 2009-06-16T12:24:24.087 に答える