Biraz alan bilgisi
Malları ödemeye veya geri ödemeye izin veren bir POS (Satış Noktası) yazılımı yazıyorum. Ödeme veya geri ödeme yaparken, hangi para transferinin kullanılacağını belirtmek gerekir : nakit, EFT (~ = kredi kartı), sadakat kartı, fiş vb.
Bu para transfer araçları sonlu ve bilinen bir değerler dizisidir (bir tür enum).
Zor kısmı, POS terminalinde hem ödemeler hem de geri ödemeler (iki set farklı olabilir) için bu araçların özel bir alt kümesini saklayabilmem gerektiğidir.
Örneğin:
- Kullanılabilir ödeme anlamına gelir: Nakit, EFT, Sadakat kartı, Çek
- Kullanılabilir geri ödeme şu anlama gelir: Nakit, Kupon
Mevcut uygulama durumu
Para transferi kavramını aşağıdaki gibi uygulamayı seçiyorum:
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...
}
Bunun "düz enum" olmamasının nedeni, bu sınıfların içinde bazı davranışların olmasıdır. Ayrıca, FluentNHibernate eşlemesinde bunlara başvurmak için iç sınıfları (özel yerine) kamuya açıklamak zorunda kaldım (aşağıya bakın).
Nasıl kullanılır
Hem ödeme hem de geri ödeme araçları her zaman DB içinde / set olarak saklanır veya alınır. Her iki kümedeki bazı değerler aynı olsa da, bunlar gerçekten iki ayrı kümedir.
Kullanım örneği 1: yeni bir ödeme / geri ödeme aracı kümesi tanımlayın
- Mevcut tüm ödeme / geri ödeme araçlarını silin
- Yenilerini ekleyin
2. durum kullanın: tüm ödeme / geri ödeme araçlarını alın
- Depolanan tüm ödeme / geri ödeme araçlarının koleksiyonunu alın
Sorun
Mevcut tasarımımla kalıcılık konusunda takılı kaldım. NHibernate (sınıf haritaları ilan etmek için FluentNHibernate ile) kullanıyorum ve bazı geçerli DB şemasına eşlemek için bir yol bulamıyorum.
Varlık adı kullanarak bir sınıfı birden çok kez eşleştirmek mümkün olduğunu ancak alt sınıflar ile mümkün olduğundan emin değilim bulundu.
Ne yapmaya hazır değilim, devam edebilmek için MoneyTransferMean genel API değiştirmek (örneğin bool isRefund
ikisi arasında ayrım yapmak için bir ekleme ). Ancak bazı özel ayırıcı alanı ya da benzeri eklemek tamam.
Mevcut eşlemem:
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...
Bu eşleme yalnızca 1 tablo oluşturur ve bu tabloyu sorgularken ödeme / geri ödeme arasında ayrım yapamıyorum.
Hem MoneyTransferMean
farklı tablo hem de varlık adı ile başvuran iki eşleme bildirmeye çalıştım, ancak bu beni bir istisna yol açar Duplicate class/entity mapping MoneyTransferMean+CashMoneyTransferMean
.
Ayrıca alt sınıf eşleştirmelerini çoğaltmaya çalıştım ama beni yukarıdaki gibi aynı özel duruma götüren bir "üst eşleme" belirleyemiyorum.
Soru
Mevcut etki alanı varlıklarımı devam ettirmek için bir çözüm var mı?
Değilse, onları NHibnernate ile devam ettirmek için varlıklarımda gerçekleştirmem gereken en küçük refactor ne olurdu?
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).
: Neden olmasın? Sorununuzu çözmesi basit ve tatlı bir değişikliktir. (İki de yinelenen kayıtları veya yapacak karşın üç olası değerleri ile telafi edebilirizFlag
tipi):Payment
,Refund
,Both
. İki değer sizin için yaparsa,bool
özellik harika.