5

假设我正在用 C# 为产品分销商开发应用程序。

分销商执行以下 3 种类型的交易:

(1) 缩进

(2) 卖出

(3) 库存

我正在设计我的课程如下:

public abstract class Transaction
{
}

public class Indent : Transaction
{
}

public class Sell : Transaction
{
}    

public class Stock : Transaction
{
}

现在如果我想将这三种类型的信息保存在三个单独的表中,那么我应该如何设计我的 DA 层?

我应该建立单独的DA类吗?

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

还是单个类TransactionDA并通过使用as/is运算符检查其类型来执行 CRUD 操作?

或者我还能做什么?有什么建议么?

4

7 回答 7

5

首先,如果您创建了单个类 TransactionDA 并检查了类中的类型以执行 CRUD 操作,那么您将违反Open/Closed 原则,所以我绝对不会走这条路。

至于如何完成构建 DAL 的建议,我建议关注一些关于比我聪明得多的人对这个主题的看法的博客文章。

存储库是新的单例

存储库已死:存储库万岁

生者之夜

我相信,对话仍在继续,但这应该让你开始。

于 2009-06-16T12:25:13.120 回答
3

我会在这里使用实体子类型。为交易创建一个表(正如之前的海报所说,也许不同的术语会更好)并在那里存储所有常见的东西。然后为每个专业创建一个“子类型”表。这些子类型表应具有与主表(“强”实体)相同的主键以及该特定专业化唯一的字段。每个子类型以一对一的方式与强实体相关联,子类型端可选参与,强实体端需要参与。

然后,为了使查询更容易,定义一个(外部)将强实体与所有实体子类型连接起来的视图,以便您可以轻松“查看”所有内容。

这是一个如何设置的简单(和常见)示例:

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 回答
3

我会使用 NHibernate 之类的 ORM 并使用它的多表继承功能,然后我自己就不必担心了。

于 2009-06-16T12:38:41.283 回答
2

如果您知道您的数据将进入三个单独的表,那么我通常会有三个单独的 DA 类。

但是,如果您的表几乎完全相同,那么您可以通用化 TransactionDA 并简化您的数据层。如果您知道您将有大量事务并且要将您的表分成不同的文件或其他东西,我只会这样做,否则我可能只会简化事情并将它们组合起来。

除非所有单独的事务类型都非常相似,否则不要尝试创建 TransactionDA 。

于 2009-06-16T12:24:53.150 回答
2

您可以使用依赖注入,为每个创建一个 DA 类,并让它们都使用您的 CRUD 操作实现相同的接口 ITransactionDA。

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

查看Gang of 4 设计模式

于 2009-06-16T12:24:24.087 回答