2011-06-30 12 views
5

के साथ आईआरपॉजिटरी के लिए एक सम्मेलन का उपयोग कैसे करें एक स्ट्रक्चर मैप में एक लाइन या एक सम्मेलन के साथ इस तरह के दोहराव मैपिंग करने का कोई तरीका है? स्ट्रक्चर मैप मैपिंग

For<IRepository<Mailout>>().Use<MailoutRepository>(); 
    For<IRepository<MailServer>>().Use<MailServerRepository>(); 
    For<IRepository<MailoutStatus>>().Use<MailoutStatusRepository>(); 
    For<IRepository<MailoutTemplate>>().Use<MailoutTemplateRepository>(); 
    For<IRepository<Publication>>().Use<PublicationRepository>(); 
    For<IRepository<Recipient>>().Use<RecipientRepository>(); 
+0

संबंधित प्रश्न - अगर मैं एक सामान्य भंडार है, वहाँ एक आसान तरीका है कि मैप करने के लिए है (उदाहरण के लिए >()। >()) का प्रयोग करें? – ssmith

+0

संबंधित प्रश्न के लिए, [स्ट्रक्चर मैप में ओपन जेनेरिक प्रकार] देखें (http://codebetter.com/jeremymiller/2009/01/13/open-generic-types-in-structuremap/)। – ladenedge

उत्तर

5

नक़्शा बनाने के लिए IRepository<Mailout>MailoutRepository करने के लिए, का उपयोग करें:

var c = new Container(x => 
{ 
    x.Scan(scan => 
    { 
     // there are other options to expand which assemblies to scan for types 
     scan.TheCallingAssembly(); 
     scan.ConnectImplementationsToTypesClosing(typeof (IRepository<>)); 
    }); 
}); 

Repository<Mailout> को IRepository<Mailout> नक़्शा बनाने के लिए, का उपयोग करें:

var c = new Container(x => 
{ 
    x.For(typeof (IRepository<>)).Use(typeof (Repository<>)); 
}); 
0

आप भंडार आधार की तरह greate कुछ कर सकता है:

public class RepositoryBase<T> : IRepository<T> where T : Entity 

तो कुछ इस तरह है:

public class UserRepository : RepositoryBase<User>, IUserRepository 
public class OtherRepository : RepositoryBase<Other>, IOtherRepository 

जहां अपने खजाने इंटरफ़ेस की तरह सामान्य भंडार इंटरफ़ेस impelement:

public interface IUserRepository : IRepository<User> 
public interface IOtherRepository : IRepository<Other> 

और उसके बाद आप इसे पंजीकृत कर सकते हैं:

For(typeof (IRepository<>)).Use(typeof (RepositoryBase<>)); 

यह मेरे लिए काम करता है।

+0

मुझे लगता है कि वह 'UserRepository 'को तुरंत चालू करना चाहता है, न कि' रिपोजिटरीबेस ', जो आपके कोड को लगता है ..? – ladenedge

+0

वास्तव में आप UserRepository को बिना किसी समस्या के किसी भी समस्या के हल कर सकते हैं: HomeController (IUserRepository userRepository) –

0

यहां एक कामकाज है, क्योंकि हमें उस मानचित्रण को बनाने का कोई छोटा रास्ता नहीं मिला।

सबसे पहले, एक खुला सामान्य कार्यान्वयन वर्ग के लिए नक्शा, 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); 

इस दृष्टिकोण का एक अन्य लाभ यह है कि आपका कस्टम भंडार व्यवहार आपके भंडार कार्यान्वयन के बावजूद काम करता है: परीक्षणों और उत्पादन कोड में। एकमात्र नकारात्मक (मुझे लगता है) यह है कि आपके भंडार अनिवार्य रूप से स्टेटलेस हैं, लेकिन हमें यह कोई समस्या नहीं है।

0
Scan(x => 
{ 
    x.WithDefaultConventions(); 
    x.AssemblyContainingType(typeof(UserRepository)); 
    x.AddAllTypesOf(typeof(Repository<>)); 
    x.ConnectImplementationsToTypesClosing(typeof(IRepository<>)); 
}); 

WithDefaultConventions इस वजह से, दिखाए गए कोड का महत्वपूर्ण हिस्सा है यूजर रिपोजिटरी में मैपिंग IUserRepository के सम्मेलन का उपयोग करने के लिए स्ट्रक्चर मैप कहें। तो StructureMap उपसर्ग के बिना इस धारणा से आगे बढ़ना है कि वर्ग इंटरफेस के नाम की तरह नाम है मैं

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