面向对象设计与数据库设计

时间:2009-06-16 12:20:23

标签: c# oop n-tier-architecture

假设我正在为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操作?

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

7 个答案:

答案 0 :(得分:5)

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

关于如何完成构建DAL的建议,我建议关注一些关于人们的博客文章,比他对这个话题的看法更聪明。

Repository is the new Singleton

Repository is Dead: Long Live Repository

Night of the Living Repositories

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

答案 1 :(得分: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
)  

答案 2 :(得分:3)

我会使用像NHibernate这样的ORM并使用它的多表继承功能,然后不必自己担心。

答案 3 :(得分:2)

如果您知道您的数据分为三个单独的表,那么我通常会有三个不同的DA类。

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

除非所有单独的交易类型极其相似,否则请勿尝试创建TransactionDA。

答案 4 :(得分:2)

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

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

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

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

答案 5 :(得分: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
{
}

答案 6 :(得分:-6)