स्पेगेटी में न डूबने का तरीका: C# में हेक्सागोनल आर्किटेक्चर

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जब प्रोजेक्ट दलिया में बदल जाता है

\n

क्या आपने कभी C# प्रोजेक्ट खोला है, जो एक साल पहले लिखा गया था, और डर के साथ महसूस किया कि सब कुछ तोड़ने के जोखिम के बिना कुछ भी नहीं बदला जा सकता? बिज़नेस लॉजिक Entity Framework के साथ कसकर जुड़ा हुआ है, ASP.NET कंट्रोलर डेटाबेस के रहस्य छिपाते हैं, और unit-टेस्ट वास्तविक DB के साथ नारकीय एकीकरण में बदल जाते हैं। परिचित लगता है?

\n

यह आर्किटेक्चर की कमी का एक क्लासिक लक्षण है। अच्छी खबर: एक सिद्ध नुस्खा है — हेक्सागोनल आर्किटेक्चर (जिसे Ports & Adapters भी कहा जाता है)। एलिस्टेयर कॉकबर्न द्वारा आविष्कार किया गया यह पैटर्न, सिर्फ एक फैशनेबल शब्द नहीं है। यह C# में मध्यम और बड़े प्रोजेक्ट्स के लिए मुक्ति है। आइए समझते हैं यह कैसे काम करता है, और तुरंत कोड लिखते हैं।

\n\n

हेक्सागोनल आर्किटेक्चर का सार: कोर और परिधि

\n

एक षट्भुज (हेक्सागोन) की कल्पना करें। केंद्र में आपका एप्लिकेशन है जिसमें शुद्ध बिज़नेस लॉजिक है, जो बाहरी निर्भरताओं के बिना शुद्ध C# में लिखा गया है। किनारों पर पोर्ट (इंटरफेस) हैं, जिनके माध्यम से कोर बाहरी दुनिया से संवाद करता है। एडेप्टर विशिष्ट कार्यान्वयन हैं: ASP.NET कंट्रोलर, EF Core रिपॉजिटरी, RabbitMQ क्लाइंट।

\n

मुख्य नियम: कोर को बाहरी दुनिया के बारे में कुछ नहीं पता। यह केवल अपने पोर्ट के बारे में जानता है। यह बिज़नेस लॉजिक को बदले बिना डेटाबेस, UI या मैसेज कतारों को बदलने की अनुमति देता है।

\n\n

C# डेवलपर के लिए यह क्यों आवश्यक है?

\n
    \n
  • परीक्षण क्षमता: बिज़नेस लॉजिक का परीक्षण DB, HTTP और फ़ाइल सिस्टम के बिना किया जा सकता है।
  • \n
  • लचीलापन: PostgreSQL को MongoDB से बदलना चाहते हैं? केवल एडेप्टर बदलें।
  • \n
  • पठनीयता: कोड आवश्यकताओं के विनिर्देश की तरह दिखता है, न कि निर्भरताओं की उलझन की तरह।
  • \n
  • SOLID का पालन: विशेष रूप से निर्भरता उलट का सिद्धांत (Dependency Inversion)।
  • \n
\n\n

C# में प्रोजेक्ट संरचना

\n

हेक्सागोनल आर्किटेक्चर में आमतौर पर तीन मुख्य परतें होती हैं। C# के लिए इसे एक ही समाधान में अलग-अलग प्रोजेक्ट के रूप में व्यवस्थित करना सुविधाजनक है:

\n\n
MyApp.sln\n├── MyApp.Domain          // कोर: एंटिटी, value objects, पोर्ट (इंटरफेस)\n├── MyApp.Application     // Use cases (एप्लिकेशन सेवाएं)\n├── MyApp.Infrastructure  // एडेप्टर: EF Core, बाहरी API, लॉगिंग\n└── MyApp.Api             // इनपुट एडेप्टर: ASP.NET कंट्रोलर / Minimal API\n
\n\n

ध्यान दें: Domain और Application शुद्ध क्लास लाइब्रेरी हैं जिनमें Microsoft.AspNetCore या EntityFramework के संदर्भ नहीं हैं। केवल System और System.Threading.Tasks।

\n\n

कोड लिखना: वास्तविक उदाहरण

\n

मान लीजिए हम एक ऑर्डर सिस्टम बना रहे हैं। एक ऑर्डर बनाना और उसे सहेजना आवश्यक है।

\n\n

चरण 1. कोर (Domain)

\n

यहां एंटिटी और पोर्ट रहते हैं — इंटरफेस जो परिभाषित करते हैं कि कोर दुनिया से कैसे संवाद करता है।

\n\n
// MyApp.Domain/Entities/Order.cs\npublic class Order\n{\n    public Guid Id { get; private set; }\n    public string CustomerName { get; private set; }\n    public decimal TotalAmount { get; private set; }\n    public DateTime CreatedAt { get; private set; }\n\n    public Order(string customerName, decimal totalAmount)\n    {\n        Id = Guid.NewGuid();\n        CustomerName = customerName;\n        TotalAmount = totalAmount;\n        CreatedAt = DateTime.UtcNow;\n    }\n}\n\n// MyApp.Domain/Ports/IOrderRepository.cs (आउटपुट पोर्ट)\npublic interface IOrderRepository\n{\n    Task<Order> GetByIdAsync(Guid id);\n    Task AddAsync(Order order);\n}\n\n// MyApp.Domain/Ports/IOrderNotifier.cs (आउटपुट पोर्ट — सूचनाएं)\npublic interface IOrderNotifier\n{\n    Task NotifyOrderCreatedAsync(Order order);\n}\n
\n\n

ध्यान दें: IOrderRepository और IOrderNotifier पोर्ट हैं। कोर परिभाषित करता है कि वह क्या चाहता है, लेकिन यह कैसे लागू किया गया है, यह नहीं।

\n\n

चरण 2. उपयोग के परिदृश्य

ब्लॉग

पुस्तक अनुशंसाएँ