(यदि आपको पढ़ने का मन नहीं है, तो नीचे एक सारांश है :-)
मैंने भी एप्लिकेशन सेवाओं की सटीक परिभाषा के साथ संघर्ष किया है। यद्यपि विजय का जवाब एक महीने पहले मेरी विचार प्रक्रिया के लिए बहुत मददगार था, लेकिन मैं इसके एक हिस्से से असहमत हूं।
अन्य संसाधन
एप्लिकेशन सेवाओं के बारे में बहुत कम जानकारी है। समग्र जड़ों, रिपॉजिटरी और डोमेन सेवाओं जैसे विषयों पर बड़े पैमाने पर चर्चा की जाती है, लेकिन आवेदन सेवाओं का केवल संक्षेप में उल्लेख किया जाता है या पूरी तरह से छोड़ दिया जाता है।
MSDN मैगज़ीन का लेख डोमेन-चालित डिज़ाइन का एक परिचय एक WCF सेवा के रूप में बाहरी ग्राहकों के लिए अपने डोमेन मॉडल को रूपांतरित करने और / या उजागर करने के तरीके के रूप में एप्लिकेशन सेवाओं का वर्णन करता है। इस तरह विजय एप्लिकेशन सेवाओं का भी वर्णन करता है। इस दृष्टिकोण से, अनुप्रयोग सेवाएँ आपके डोमेन के लिए एक इंटरफ़ेस हैं ।
प्याज वास्तुकला पर जेफरी पलेर्मो के लेख (भाग एक , दो और तीन ) एक अच्छा पढ़ा है। वह एप्लिकेशन सेवाओं को एप्लिकेशन-स्तरीय अवधारणाओं के रूप में मानता है , जैसे कि उपयोगकर्ता का सत्र। यद्यपि यह एप्लिकेशन सेवाओं की मेरी समझ के करीब है, यह अभी भी इस विषय पर मेरे विचारों के अनुरूप नहीं है।
मेरे विचार
मैं आवेदन सेवाओं के बारे में सोचता आया हूं जो कि आवेदन द्वारा प्रदान की गई निर्भरता है । इस मामले में एप्लिकेशन डेस्कटॉप एप्लिकेशन या डब्ल्यूसीएफ सेवा हो सकती है।
डोमेन
एक उदाहरण के लिए समय। आप अपने डोमेन से शुरुआत करते हैं। सभी इकाइयाँ और कोई भी डोमेन सेवाएँ जो बाहरी संसाधनों पर निर्भर नहीं हैं, उन्हें यहाँ लागू किया जाता है। किसी भी डोमेन अवधारणा जो बाहरी संसाधनों पर निर्भर करती है, एक इंटरफ़ेस द्वारा परिभाषित की जाती है। यहां एक संभावित समाधान लेआउट (बोल्ड में परियोजना का नाम) है:
मेरा समाधान
- My.Product.Core (My.Product.dll)
- डोमेन सेवा
IExchangeRateService
उत्पाद
ProductFactory
IProductRepository
Product
और ProductFactory
कक्षाओं कोर विधानसभा में लागू किया गया है। एक IProductRepository
ऐसी चीज है जो संभवतः एक डेटाबेस द्वारा समर्थित है। इसे लागू करना डोमेन की चिंता नहीं है और इसलिए इसे एक इंटरफ़ेस द्वारा परिभाषित किया गया है।
अभी के लिए, हम इस पर ध्यान केंद्रित करेंगे IExchangeRateService
। इस सेवा के लिए व्यावसायिक तर्क बाहरी वेब सेवा द्वारा कार्यान्वित किया जाता है। हालाँकि, इसकी अवधारणा अभी भी डोमेन का हिस्सा है और इस इंटरफ़ेस द्वारा दर्शाया गया है।
भूमिकारूप व्यवस्था
बाहरी निर्भरता का कार्यान्वयन अनुप्रयोग के बुनियादी ढांचे का हिस्सा है:
मेरा समाधान
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- डोमेन सेवा
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
xe.com केIExchangeRateService
साथ संचार करके डोमेन सेवा को लागू करता है । इस कार्यान्वयन का उपयोग आपके अनुप्रयोगों द्वारा किया जा सकता है जो आपके डोमेन मॉडल का उपयोग करते हैं, बुनियादी ढांचे की विधानसभा को शामिल करके।
आवेदन
ध्यान दें कि मैंने अभी तक एप्लिकेशन सेवाओं का उल्लेख नहीं किया है। हम अब उन पर गौर करेंगे। मान लें कि हम एक IExchangeRateService
कार्यान्वयन प्रदान करना चाहते हैं जो त्वरित लुकअप के लिए कैश का उपयोग करता है। इस डेकोरेटर वर्ग की रूपरेखा इस तरह दिख सकती है।
public class CachingExchangeRateService : IExchangeRateService
{
private IExchangeRateService service;
private ICache cache;
public CachingExchangeRateService(IExchangeRateService service, ICache cache)
{
this.service = service;
this.cache = cache;
}
// Implementation that utilizes the provided service and cache.
}
ICache
पैरामीटर ध्यान दें ? यह अवधारणा हमारे डोमेन का हिस्सा नहीं है, इसलिए यह एक डोमेन सेवा नहीं है। यह एक एप्लिकेशन सेवा है । यह हमारे बुनियादी ढांचे की एक निर्भरता है जो आवेदन द्वारा प्रदान की जा सकती है। आइए एक आवेदन पेश करें जो इसे प्रदर्शित करता है:
मेरा समाधान
- My.Product.Core (My.Product.dll)
- डोमेन सेवा
IExchangeRateService
उत्पाद
ProductFactory
IProductRepository
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- अनुप्रयोग सेवाएँ
ICache
- डोमेन सेवा
CachingExchangeRateService
XEExchangeRateService
SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
- अनुप्रयोग सेवाएँ
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
यह सब इस तरह से आवेदन में एक साथ आता है:
// Set up all the dependencies and register them in the IoC container.
var service = new XEExchangeRateService();
var cache = new MemcachedCache();
var cachingService = new CachingExchangeRateService(service, cache);
ServiceLocator.For<IExchangeRateService>().Use(cachingService);
सारांश
एक पूर्ण अनुप्रयोग में तीन प्रमुख परतें होती हैं:
- डोमेन
- आधारिक संरचना
- आवेदन
डोमेन परत में डोमेन इकाइयाँ और स्टैंड-अलोन डोमेन सेवाएँ शामिल हैं। कोई भी डोमेन अवधारणा (इसमें डोमेन सेवाएँ, लेकिन रिपॉजिटरी भी शामिल हैं) जो बाहरी संसाधनों पर निर्भर करती हैं, इंटरफेस द्वारा परिभाषित की जाती हैं।
बुनियादी ढांचे की परत में डोमेन परत से इंटरफेस का कार्यान्वयन शामिल है। ये कार्यान्वयन नए गैर-डोमेन निर्भरताएँ पेश कर सकते हैं जिन्हें आवेदन प्रदान किया जाना है। ये अनुप्रयोग सेवाएँ हैं और इंटरफेस द्वारा दर्शाई गई हैं।
एप्लिकेशन परत में एप्लिकेशन सेवाओं का कार्यान्वयन शामिल है। आवेदन परत में डोमेन इंटरफेस के अतिरिक्त कार्यान्वयन भी हो सकते हैं, यदि बुनियादी ढांचे की परत द्वारा प्रदान किए गए कार्यान्वयन पर्याप्त नहीं हैं।
हालाँकि यह परिप्रेक्ष्य सेवाओं की सामान्य DDD परिभाषा से मेल नहीं खा सकता है, यह डोमेन को एप्लिकेशन से अलग करता है और आपको कई अनुप्रयोगों के बीच डोमेन (और इन्फ्रास्ट्रक्चर) असेंबली साझा करने की अनुमति देता है।