약간의 도메인 지식
상품을 지불하거나 환불 할 수있는 POS (Point Of Sales) 소프트웨어를 작성 중입니다. 지불 또는 환불시 현금, EFT (~ = 신용 카드), 포인트 카드, 바우처 등 사용할 송금 수단 을 지정해야합니다 .
이러한 자금 이체 수단은 유한하고 알려진 가치의 집합입니다 (일종의 열거 형).
까다로운 부분은 POS 단말기에서 지불 및 환불 (두 세트가 다를 수 있음)을 위해 이러한 수단의 사용자 정의 하위 집합을 저장할 수 있어야한다는 것입니다.
예를 들면 다음과 같습니다.
- 사용 가능한 결제 수단 : 현금, EFT, 로열티 카드, 바우처
- 사용 가능한 환불 수단 : 현금, 바우처
현재 구현 상태
다음과 같이 송금 수단의 개념을 구현하기로 선택합니다.
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 매핑에서 참조하기 위해 내부 클래스를 private 대신 public으로 선언해야했습니다 (아래 참조).
사용 방법
지불 및 환불 수단은 항상 세트로 DB에 저장되거나 DB에서 검색됩니다. 두 세트 내부의 일부 값이 동일하더라도 실제로는 두 개의 고유 세트입니다.
사용 사례 1 : 새로운 결제 / 환불 수단을 정의
- 기존 결제 / 환불 수단을 모두 삭제
- 새로운 것을 삽입하십시오
사용 사례 2 : 모든 지불 / 환불 수단 검색
- 저장된 모든 지불 / 환불 수단의 모음을 가져옵니다.
문제
지속성 측면에서 현재 디자인을 고수하고 있습니다. NHibernate (클래스 맵을 선언하기 위해 FluentNHibernate와 함께)를 사용하고 있으며 유효한 DB 스키마에 매핑하는 방법을 찾을 수 없습니다.
entity-name을 사용하여 클래스를 여러 번 맵핑 할 수 있지만 서브 클래스에서 가능하다는 것을 확신하지 못합니다.
내가 준비하지 않은 것은 MoneyTransferMean 공용 API를 변경하여 유지할 수 있도록하는 것입니다 (예 : bool isRefund
둘을 구별 하기 위해 a 추가 ). 그러나 개인 차별 자 필드를 추가하는 것은 좋습니다.
내 현재 매핑 :
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...
이 매핑은 컴파일되지만 하나의 테이블 만 생성 하므로이 테이블을 쿼리 할 때 지불 / 환불을 구별 할 수 없습니다.
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
재산은 위대합니다.