假设我正在为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操作?
或者我还能做什么?有什么建议吗?
答案 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)