一点领域知识
我正在写一个POS(销售点)软件,该软件可以付款或退款。付款或退款时,需要指定使用哪种汇款方式:现金,EFT(〜=信用卡),会员卡,代金券等。
这些汇款方式是一组有限的已知值(一种枚举)。
棘手的是,我需要能够在POS终端上存储这些方式的自定义子集,以用于付款和退款(两组可能不同)。
例如:
- 可用付款方式:现金,电子转帐,会员卡,优惠券
- 可用退款方式:现金,代金券
实施现状
我选择实施汇款的概念意味如下:
public abstract class MoneyTransferMean : AggregateRoot
{
public static readonly MoneyTransferMean Cash = new CashMoneyTransferMean();
public static readonly MoneyTransferMean EFT = new EFTMoneyTransferMean();
// and so on...
//abstract method
public class CashMoneyTransferMean : MoneyTransferMean
{
//impl of abstract method
}
public class EFTMoneyTransferMean : MoneyTransferMean
{
//impl of abstract method
}
//and so on...
}
它不是“普通枚举”的原因是这些类内部存在某些行为。为了在FluentNHibernate映射中引用它们,我还必须声明内部类为public(而不是private)(请参见下文)。
如何使用
始终将付款和退款方式作为一组存储在DB中或从DB中检索出来。它们实际上是两个不同的集合,即使两个集合中的某些值可能相同。
用例1:定义一组新的付款/退款方式
- 删除所有现有的付款/退款方式
- 插入新的
用例2:检索所有付款/退款方式
- 获取所有存储的付款/退款方式的集合
问题
我在持久性方面停留在当前的设计上。我正在使用NHibernate(使用FluentNHibernate来声明类映射),但是我找不到将其映射到某些有效DB模式的方法。
我发现可以使用实体名称多次映射一个类,但是我不确定子类是否可以映射。
我不准备做的是更改MoneyTransferMean公共API以使其能够持久(例如,添加a bool isRefund
来区分两者)。但是,可以添加一些私有区分符字段。
我当前的映射:
public sealed class MoneyTransferMeanMap : ClassMap<MoneyTransferMean>
{
public MoneyTransferMeanMap()
{
Id(Entity.Expressions<MoneyTransferMean>.Id);
DiscriminateSubClassesOnColumn("Type")
.Not.Nullable();
}
}
public sealed class CashMoneyTransferMeanMap : SubclassMap<MoneyTransferMean.CashMoneyTransferMean>
{
public CashMoneyTransferMeanMap()
{
DiscriminatorValue("Cash");
}
}
public sealed class EFTMoneyTransferMeanMap : SubclassMap<MoneyTransferMean.EFTMoneyTransferMean>
{
public EFTMoneyTransferMeanMap()
{
DiscriminatorValue("EFT");
}
}
//and so on...
该映射会编译,但是它仅生成1个表,查询该表时我无法区分付款/退款。
我试图声明两个引用MoneyTransferMean
不同表和实体名称的映射,但是这导致了异常Duplicate class/entity mapping MoneyTransferMean+CashMoneyTransferMean
。
我也尝试复制子类映射,但是无法指定“父映射”,这导致我遇到与上述相同的异常。
题
是否存在解决方案来保留我当前的域实体?
如果不是,那么我需要对实体执行的最小重构是什么,以使其可以与NHibnernate持久化?
What I'm not ready to do is to alter the MoneyTransferMean public API to be able to persist it (for example adding a bool isRefund to differentiate between the two).
: 为什么不?应该解决您的问题的简单而甜蜜的更改。您可以了三个可能的值(虽然两人还将会重复记录或做Flag
类型): ,Payment
,。Refund
Both
如果有两个值对您有用,那么bool
属性就很棒。