2008-12-04 15 views
8

मैं सोच रहा हूं कि एनएचबीनेटनेट को मेरे पॉको डोमेन ऑब्जेक्ट्स पर निर्भरताओं को हल करने के लिए कैसे बताना है।NHibernate ऑब्जेक्ट्स के साथ निर्भरता इंजेक्शन

मुझे पता चला कि CalculateOrderTax जैसे विधियां डोमेन ऑब्जेक्ट में होनी चाहिए क्योंकि वे डोमेन विशिष्ट व्यावसायिक नियमों को एन्कोड करते हैं। लेकिन एक बार मेरे पास दो में से एक है मैं एसआरपी का उल्लंघन कर रहा हूँ।

रणनीति वर्गों के लिए उन तरीकों को निकालने में कोई समस्या नहीं होगी, लेकिन मुझे आश्चर्य है कि एनएचबीर्नेट को उनको कैसे लोड किया जाए।

यह ऑब्जेक्ट को उच्च परतों पर बंद करने से पहले निर्भर/सेट आधारित निर्भरता इंजेक्शन करने के लिए रिपोजिटरी में ऑब्जेक्ट्स की एक सूची के माध्यम से लूप के लिए एक अच्छा समाधान प्रतीत नहीं होता है।

मैं अभी भी अपने निर्भरता इंजेक्शन के लिए कैसल विंडसर का उपयोग कर रहा हूं।

उत्तर

8

मैं इसी तरह के कार्यों के लिए इंटरसेप्टर का उपयोग कर:

एक इंटरसेप्टर कि भरी हुई संस्थाओं को संशोधित करता है:

public class MyInterceptor : EmptyInterceptor 
{ 
    public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types) 
    { 
     return InjectDependencies(entity as MyEntity); 
    } 
} 

एक सत्र के साथ एसोसिएट यह:

nhSessionFactory.OpenSession(myInterceptor); 

मैं भी पढ़ा है कहीं भी आगामी 2.1 रिलीज में कस्टम कन्स्ट्रक्टर इंजेक्शन के लिए बेहतर समर्थन होगा लेकिन मुझे अभी संदर्भ नहीं मिल रहा है।

+0

फैबियो (वर्तमान लीड प्रोग्रामर) यहां नए कन्स्ट्रक्टर इंजेक्शन की व्याख्या करता है: http://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.html –

+0

यही वह है जो मैं करने जा रहा हूं। क्या आप Instantiate के बजाय ऑनलोड ईवेंट का उपयोग करके औचित्य साबित कर सकते हैं? –

+0

ऐसा लगता है कि इंस्टेंटिएट आपके कारखाने को बनाने का एक तरीका है (यदि आप कन्स्ट्रक्टर इंजेक्शन का उपयोग करना चाहते हैं तो यह काफी अच्छा हो सकता है)। मुझे बस एक अतिरंजित बेस क्लास में एक सेवा इंजेक्ट की जरूरत है। –

1

क्योंकि कोई भी इस समय आपके प्रश्न का उत्तर देने में सक्षम नहीं लगता है, मैंने सोचा था कि मैं आदेश के लिए अपने कर को गणना करने के लिए आदेश की आवश्यकता को दूर करने के लिए अपने कोड को पुनर्गठन का सुझाव दूंगा।

आप इसे ऑर्डरटेक्स सेवा में भेज सकते हैं जो ऑर्डर ऑब्जेक्ट लेता है और ऑर्डरवैल्यू ऑब्जेक्ट या उन पंक्तियों के साथ कुछ देता है।

यह आपके डोमेन में तर्क रखेगा लेकिन इसे आपके ऑर्डर ऑब्जेक्ट्स से अटैच करने की आवश्यकता को हटा देगा।

+0

इस तरह मैं इसे अभी करता हूं। मैं हर समय ऑर्डर पास करता हूं और बाहरी कक्षाओं को सामान की गणना करने देता हूं। यह सिर्फ गलत लगता है क्योंकि मेरी वस्तुएं हैं) म्यूटेबल और बी) मुझे हर समय उन सेवाओं को ले जाने की ज़रूरत है क्योंकि अगर मैं उन्हें व्यवसाय तर्क कोड से नया नहीं करना चाहता हूं। – Tigraine

+0

एक चीज के लिए कई रणनीतियों के दौरान यह मुश्किल हो जाता है। सामान्य टैक्सेट के साथ ऑर्डर की तरह दूसरों की तुलना में अलग-अलग गणना की जाती है। मुझे तब सेवाओं को यह तय करना होगा कि किसी दिए गए डोमेन ऑब्जेक्ट के लिए करों की गणना कैसे करें। .. – Tigraine

1

मैं गैरी से सहमत हूं कि आपको जितनी ज्यादा हो सके अपने डोमेन ऑब्जेक्ट्स से सेवा निर्भरताओं को हटा देना चाहिए। कभी-कभी यह एन्क्रिप्शन/डिक्रिप्शन जैसे समझ में आता है। उस स्थिति में आप इसे अवरोध या IUserType का उपयोग करके बुनियादी ढांचे में छुपा सकते हैं। मुझे लगता है कि जब आप इसका उपयोग कर सकते हैं तो उत्तरार्द्ध अनुकूल है। This article विस्तार से दिखाता है कि इसे कैसे करें। मैं यह कर रहा हूं और यह काफी ठीक काम करता है।

संबंधित मुद्दे