में बहुलक पॉलीमोर्फिक ऑब्जेक्ट्स का निर्माण करना मेरे प्रश्न का सार यह है कि एमवीसी 3 और निनजेक्ट के साथ एक समझदार तरीके से इन वस्तुओं को कैसे लिखें (नीचे देखें) (हालांकि मुझे यकीन नहीं है कि डीआई को समाधान में भूमिका निभाई जानी चाहिए)। मैं अपने प्रोजेक्ट के वास्तविक विवरण का खुलासा नहीं कर सकता लेकिन यहां एक अनुमान है जो इस मुद्दे/प्रश्न को दर्शाता है। या तो वीबी या सी # में जवाब की सराहना की जाती है!एएसपी.नेट एमवीसी 3 प्रोजेक्ट
मेरे पास व्यापक रूप से भिन्न गुणों के साथ कई अलग-अलग उत्पाद हैं, फिर भी उनमें से सभी को एक सूची में प्रतिनिधित्व करने की आवश्यकता है। प्रत्येक उत्पाद वर्ग में मेरे डेटाबेस में एक संबंधित तालिका है। एक कैटलॉग एंट्री में कैटलॉग एंट्री होने के लिए विशिष्ट गुणों का एक मुट्ठी भर होता है और इसके परिणामस्वरूप उनकी अपनी तालिका होती है। मैंने सूची प्रविष्टियों के लिए एक इंटरफ़ेस परिभाषित किया है, जिसमें विवरण टेक्स्ट को सम्मिलित करने के इरादे से अंतर्निहित ठोस प्रकार के आधार पर मुझे बहुत अलग परिणाम मिलेंगे।
Public Class Clothing
Property Identity as Int64
Property AvailableSizes As List(Of String)
Property AvailableColor As List(Of String)
End Class
Public Class Fasteners
Property Identity as Int64
Property AvailableSizes As List(Of String)
Property AvailableFinishes As List(Of String)
Property IsMetric As Boolean
End Class
Public Interface ICatalogEntry
Property ProductId as Int64
Property PublishedOn As DateTime
Property DescriptionText As String
End Interface
यह देखते हुए कि DescriptionText एक प्रस्तुति परत चिंता मैं अपने उत्पाद की कक्षाओं में ICatalogEntry इंटरफ़ेस को लागू नहीं करना चाहती है। इसके बजाय मैं इसे किसी प्रकार के फॉर्मेटर को प्रतिनिधि बनाना चाहता हूं।
Public Interface ICatalogEntryFormatter
Property DescriptionText As String
End Interface
Public Class ClothingCatalogEntryFormatter
Implements ICatalogEntryFormatter
Property DescriptionText As String
End Class
Public Class FastenerCatalogEntryFormatter
Implements ICatalogEntryFormatter
Property DescriptionText As String
End Class
एक नियंत्रक में कहीं इस तरह कोड होगा:
Dim entries As List(Of ICatalogEntry)
= catalogService.CurrentCatalog(DateTime.Now)
एक ध्यान में रखते हुए कहीं इस तरह कोड होगा:
<ul>
@For Each entry As ICatalogEntry In Model.Catalog
@<li>@entry.DescriptionText</li>
Next
</ul>
तो सवाल यह कि क्या करना है रचनाकार दिखते हैं? इसे कैसे सेट करें ताकि उपयुक्त वस्तुओं को सही जगहों पर तुरंत चालू किया जा सके। जेनेरिक की तरह लगता है या शायद DI इसके साथ मदद कर सकता है लेकिन मुझे मानसिक ब्लॉक होने लगता है। केवल विचार मैं ले कर आए हैं ICatalogEntry करने के लिए एक ProductType संपत्ति जोड़ने के लिए और फिर इस तरह एक कारखाने को लागू है:
Public Class CatalogEntryFactory
Public Function Create(catEntry as ICatalogEntry) As ICatalogEntry
Select Case catEntry.ProductType
Case "Clothing"
Dim clothingProduct = clothingService.Get(catEntry.ProductId)
Dim clothingEntry = New ClothingCatalogEntry(clothingProduct)
Return result
Case "Fastener"
Dim fastenerProduct = fastenerService.Get(catEntry.ProductId)
Dim fastenerEntry = New FastenerCatalogEntry(fastenerProduct)
fastenerEntry.Formatter = New FastenerCatalogEntryFormatter
Return fastenerEntry
...
End Function
End Class
Public ClothingCatalogEntry
Public Sub New (product As ClothingProduct)
Me.Formatter = New ClothingCatalogEntryFormatter(product)
End Sub
Property DescriptionText As String
Get
Return Me.Formatter.DescriptionText
End Get
End Property
End Class
...FastenerCatalogEntry is omitted but you get the idea...
Public Class CatalogService
Public Function CurrentCatalog(currentDate as DateTime)
Dim theCatalog As List(Of ICatalogEntry)
= Me.repository.GetCatalog(currentDate)
Dim theResult As New List(Of ICatalogEntry)
For Each entry As ICataLogEntry In theCatalog
theResult.Add(factory.Create(entry))
Next
Return theResult
End Function
End Class
IMHO, मैं वास्तव में किसी भी हो रही है नहीं कर रहा हूँ अन्य इस कोड को बंद बदबू आ रही है बदलने के लिए की तुलना में साथ आने वाले हर नए उत्पाद वर्ग के लिए कारखाना। फिर भी, मेरा आंत कहता है कि यह चीजों को करने का पुराना तरीका है और आजकल डीआई और/या जेनेरिक यह बेहतर कर सकते हैं। इसे संभालने के तरीकों पर सुझावों की बहुत सराहना की जाती है (जैसा कि बेहतर शीर्षक पर सुझाव हैं ...)
तो कस्टम रिज़ॉल्यूवर इस तथ्य को संभालता है कि एक से अधिक कक्षा एक ही इंटरफ़ेस के मानचित्र हैं? यही कारण है कि मुझे अपने प्रश्न में कारखाने वर्ग में धक्का दे रहा है और यही वह है जो मैं सबसे ज्यादा असहज हूं और पूरी तरह अस्पष्ट हूं कि कैसे छुटकारा पाएं। – schmidlop
ठीक है, अब मैंने आपके द्वारा प्रदान किए गए लिंक को पढ़ा है, मैंने निष्कर्ष निकाला है कि मुझे उचित रूप से मेरे डी कंटेनर (निनजेक्ट) को इस परिदृश्य के लिए कुछ जवाब देने की उम्मीद करनी चाहिए। इसके अलावा ऐसा लगता है कि यह करता है और मुझे प्रासंगिक बाध्यकारी https://github.com/ninject/ninject/wiki/Contextual- बाइंडिंग की आवश्यकता है और मुझे शायद इसकी भी आवश्यकता है: https://github.com/ninject/ninject.extensions। कारखाना/विकी – schmidlop
हाँ, यह वास्तव में आपकी समस्या का समाधान करना चाहिए। आपके निंजा प्रारंभ में आपको संसाधन फ़ाइल से लोड करने में सक्षम होना चाहिए। –