質問

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 で、 as / is 演算子を使用してタイプをチェックすることでCRUD操作を実行しますか?

または他に何ができますか?提案はありますか?

役に立ちましたか?

解決

まず、単一クラスTransactionDAを作成し、クラス内で型をチェックしてCRUD操作を実行すると、オープン/クローズの原則なので、絶対にその道をたどりません。

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

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

リポジトリis Dead:Long Live Repository

Night of the Living Repositories

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

他のヒント

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

ここでは、エンティティサブタイプを使用します。トランザクション用のテーブルを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
)  

データが3つの個別のテーブルに送られることがわかっている場合、通常は3つの個別のDAクラスがあります。

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

すべての個別のトランザクションタイプが極端に類似している場合を除き、TransactionDAを作成しようとしないでください。

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

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

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

Stock stock = new Stock(new StockDA());

そのようなことをします

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
{
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top