मैं एक स्टोरेज सिस्टम एप्लीकेशन बना रहा हूं। प्रत्येक स्टोरेज सिस्टम में स्टॉक आइटम को स्टोर करने में सक्षम 10 वेयरहाउस तक होते हैं।

मैं वेयरहाउस गुणों (नाम, विवरण आदि) को अद्यतन करने के लिए एक विधि बनाना चाहता हूं। एक व्यावसायिक नियम है कि भंडारण प्रणाली के भीतर प्रत्येक वेयरहाउस का एक विशिष्ट नाम होना चाहिए, और यह सुनिश्चित नहीं है कि इसके लिए कौन सा वर्ग जिम्मेदार होना चाहिए। मैं इस सिद्धांत पर टिके रहने की कोशिश कर रहा हूं कि प्रत्येक वर्ग को केवल अपने लिए जिम्मेदार होना चाहिए।

यहां कोड का एक सरल नकली है (सी #)

 public class StorageSystem
{
    public List<Warehouse> Warehouses{Get;}
}

public class Warehouse
{
    public string Name{Get; private Set;}

    public int StorageSystemId{Get; Set;}
    public StorageSystem Sotrage System{Get; Set;}
}

मुझे लगता है कि मुझे निम्नलिखित करना चाहिए,

चरण 1। स्टोरेज सिस्टम क्लास में एक विधि बनाएं।

public bool WarehouseNameAvailable(string name)
{
   //Check List of Warehouses for the name
   //if found return false
   //else return true
}

चरण 2। वेयरहाउस में एक विधि बनाएं

public void UpdateWarehouseName(string name)
{
   if(StorageSystem.WarehouseNameAvailable(name))
    {
        this.name = name;
    }
    else 
    {
        //Throw Exception 
    {
}

क्या ऐसा करने का यह "उचित और सही" तरीका है?

0
Ben_jamin 25 सितंबर 2018, 13:31

2 जवाब

सबसे बढ़िया उत्तर

क्या ऐसा करने का यह "उचित और सही" तरीका है?

यह अत्यधिक आपके समग्र एप्लिकेशन आर्किटेक्चर, इम्हो पर निर्भर करता है। 5 डेवलपर्स से पूछें कि क्या आपका समाधान "उचित और सही" है और आपको 6 राय मिलेगी।

बिंदु पर जाने के लिए: जब पूरी तरह से डीडीडी अवधारणाओं से संबंधित होता है, तो आपका समाधान कम से कम संभव लगता है। लेकिन ईमानदार होने के लिए, मैं कभी भी उल्लेखनीय आकार के उद्यम अनुप्रयोग में नहीं आया हूं जो अपने व्यावसायिक तर्क को पूरी तरह से डोमेन मॉडल में संरचित (!) उस पर परत। मैं व्यक्तिगत रूप से इस दृष्टिकोण को पसंद करता हूं और इस आवश्यकताओं को अलग-अलग वर्गों में प्रस्तुत करने की अनुशंसा करता हूं, जो व्यवसाय/उपयोग के मामलों का प्रतिनिधित्व करते हैं:

public class RenameAction {
    //Some Kind of DbSet, Database Connection, external service,...
    //I'll go with an EF - DbSet<Warehouse> in this example
    private readonly DbSet<Warehouse>_warehouses;
    private readonly DbSet<StorageSystem> _storageSystem;

    public void Execute(int storageSystemId, int warehouseId, string name) {
        var storageSystem = _storageSystems.Single(system => system.Id == storageSystemId);

        if (_storageSystem.Warehouses.Any(wh => wh.Name == name))
            throw new BusinessLogicException("Warehouse names must be unique within storage systems!");
        var warehouse = storageSystem.Warehouses.Single(wh => wh.Id == warehouseId);
        warehouse.Name = name;

        //Write back the updated warehouse to whereever, this won't work with an DbSet<Warehouse>.
        _warehouses.Update(warehouse);
    }
}

लेकिन फिर से, मैं इस तरह से इससे निपटता हूं।

1
Peter Wurzinger 25 सितंबर 2018, 16:51

T_WAREHOUSE.NAME को अद्वितीय बनाएं (बस मान लें कि आपकी तालिका/स्तंभों में इस तरह के नाम होंगे) - डेटाबेस के अनुसार और यदि दूसरी प्रविष्टि उसी नाम से लिखी जाती है तो अपवाद को संभालें।

उपयोगकर्ताओं को यह दिखाने के लिए कि क्या गलत हुआ, आप उस त्रुटि/अपवाद को उपयोगकर्ता स्तर तक भी बढ़ा सकते हैं: enter a different name please, "Super Dooper Warehouse" is already taken


आपके प्रश्न पाठ से पता चलता है कि यह एक बड़ी परियोजना होगी जिसमें कई वर्ग एक दूसरे के साथ बातचीत करेंगे।

यदि आप ओआरएम का उपयोग नहीं कर रहे हैं, तो एक का उपयोग करने के बारे में सोचें! यह आपके WarehouseNameAvailable वर्कअराउंड जैसे कस्टम तरीकों के माध्यम से बहुत कुछ हासिल करने की कोशिश कर रहा है।

यदि आप Entity Framework का उपयोग कर रहे हैं तो आप इसे अपने वर्ग गुणों पर [Unique] विशेषता के माध्यम से कर सकते हैं।

1
nilsK 25 सितंबर 2018, 13:49