यहां एक कामकाज है, क्योंकि हमें उस मानचित्रण को बनाने का कोई छोटा रास्ता नहीं मिला।
सबसे पहले, एक खुला सामान्य कार्यान्वयन वर्ग के लिए नक्शा, discussed elsewhere के रूप में:
For(typeof(IRepository<>)).Use(typeof(ConcreteRepository<>));
फिर, कस्टम व्यवहार के साथ प्रत्येक भंडार के लिए, विस्तार के तरीकों उचित इंटरफेस पर जोड़ें। उदाहरण के लिए, मान अपने MailoutStatusRepository
एक विधि GetStatus()
है, तो आपको एक विस्तार विधि के लिए कि अनुवाद कर सकता है IRepository<MailoutStatusRepository>
पर:
public static Status GetStatus(this IRepository<MailoutStatusRepository> repo,
Mailout mail)
{
return mail.Status; // or whatever
}
अब आप कस्टम भंडार व्यवहार कुछ कस्टम वर्ग के लिए StructureMap के उत्पादन कास्टिंग के बारे में चिंता किए बिना:
var repo = container.GetInstance<IRepository<MailoutStatusRepository>>();
var status = repo.GetStatus(mailout);
इस दृष्टिकोण का एक अन्य लाभ यह है कि आपका कस्टम भंडार व्यवहार आपके भंडार कार्यान्वयन के बावजूद काम करता है: परीक्षणों और उत्पादन कोड में। एकमात्र नकारात्मक (मुझे लगता है) यह है कि आपके भंडार अनिवार्य रूप से स्टेटलेस हैं, लेकिन हमें यह कोई समस्या नहीं है।
संबंधित प्रश्न - अगर मैं एक सामान्य भंडार है, वहाँ एक आसान तरीका है कि मैप करने के लिए है (उदाहरण के लिए >()। >()) का प्रयोग करें? –
ssmith
संबंधित प्रश्न के लिए, [स्ट्रक्चर मैप में ओपन जेनेरिक प्रकार] देखें (http://codebetter.com/jeremymiller/2009/01/13/open-generic-types-in-structuremap/)। – ladenedge