代码之家  ›  专栏  ›  技术社区  ›  user366312

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

  •  5
  • user366312  · 技术社区  · 16 年前

    假设我正在为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 并通过使用检查其类型来执行CRUD操作 as/is 操作员?

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

    7 回复  |  直到 16 年前
        1
  •  5
  •   Joseph    16 年前

    首先,如果创建单个类Transactionda并检查类内的类型以执行CRUD操作,则会违反 Open/Closed Principle 所以我绝对不会走这条路。

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

    Repository is the new Singleton

    Repository is Dead: Long Live Repository

    Night of the Living Repositories

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

        2
  •  3
  •   Garry Shutler    16 年前

    我会使用诸如nhibernate这样的ORM,并使用它的多表继承功能,然后就不必担心它了。

        3
  •  3
  •   Alan    16 年前

    我将在这里使用实体子类型。为事务创建一个表(正如前面的海报所说,也许用另一个术语更好),并存储其中常见的所有内容。然后为每个专门化创建一个“子类型”表。这些子类型表应该具有与主表(“强”实体)相同的主键,以及对该特定专门化唯一的字段。每个子类型以一对一的方式与强实体相关,可以选择参与子类型端,也可以要求参与强实体端。

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

    下面是一个简单(也是常见)的示例,说明如何设置:

    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
    )  
    
        4
  •  2
  •   Nathan DeWitt    16 年前

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

    但是,如果您的表几乎完全相同,那么您可以将Transactionda泛型化并简化数据层。只有当您知道您将拥有大量事务并且将要将表分离为不同的文件或其他内容时,我才会这样做,否则我可能只会简化这些内容并将它们组合在一起。

    除非所有单独的事务类型都是 极其 类似的。

        5
  •  2
  •   George    16 年前

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

    public interface ITransactionDA
    {
      void Read();
      void Update();
    ...
    }
    
    public class StockDA : ITransactionDA
    {
      //implement interface methods
    }
    
    Stock stock = new Stock(new StockDA());
    
        6
  •  0
  •   Ahmed    16 年前

    我会那样做的

    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
    {
    }
    
        7
  •  -6
  •   Kieveli    16 年前