2009-03-27 12 views
5

के लिए स्ट्रक्चर मैप के साथ कन्स्ट्रक्टर के लिए अलग ऑब्जेक्ट इंजेक्ट करें मेरे पास आईआरपीओसेटरी < टी> है, और कार्यान्वयन एसक्यूएल रिपोजिटरी < टी> है। SqlRepository में कन्स्ट्रक्टर में DataContext पैरामीटर है।कुछ मामले

एसएम विन्यास इस तरह दिखता है:

x.ForRequestedType(typeof(IRepository<>)) 
.TheDefaultIsConcreteType(typeof(SqlRepository<>)); 

x.ForRequestedType<DataContext>().CacheBy(InstanceScope.Hybrid) 
.TheDefault.Is.ConstructedBy(()=>{ 
         var dc = new FirstDataContext(); 
         dc.Log = new DebuggerWriter(); 
         return dc; 
        }); 

लेकिन IRepository < SpecificObject के निर्माण के लिए> मैं अलग DataContext इंजेक्षन करना चाहते हैं। मैं एसएम कैसे कहूं कि जब मैं आईरिपोसियेट्री < विशिष्ट ऑब्जेक्ट के लिए पूछता हूं> मुझे अलग डेटाकॉन्टेक्स्ट चाहिए, फर्स्टडाटा कॉन्टेक्स्ट नहीं, लेकिन सेकेंडडाटा कॉन्टेक्स्ट (डीसी विभिन्न डेटाबेस पर जाता है)।

उदाहरण के लिए, जब मैं IRepository < टी के लिए पूछने> मैं चाहता हूँ FirstDataContext इंजेक्ट किया जा करने के लिए, लेकिन जब मैं IRepository < उत्पाद के लिए स्पष्ट रूप से पूछना> मैं SecondDataContext इंजेक्ट किया जा करना चाहते हैं।

इसके अलावा, सेकेंड डीसी को एसएम द्वारा संकर हाइब्रिड होना चाहिए!

उत्तर

4

कुछ की तरह ...

ForRequestedType<DataContext>() 
    .CacheBy(InstanceScope.Hybrid) 
    .AddInstances(inst => inst.ConstructedBy(() => 
     new SecondDataContext { Log = new DebuggerWriter() }) 
     .WithName("secondDataContext")) 
    .TheDefault.Is 
    .ConstructedBy(() => new FirstDataContext {Log = new DebuggerWriter()}); 

ForRequestedType<IRepository<SpecificObject>>() 
    .TheDefault.Is 
    .OfConcreteType<SqlRepository<SpecificObject>>() 
    .CtorDependency<DataContext>() 
    .Is(inst => inst.TheInstanceNamed("secondDataContext")); 
+0

यह काम किया! महान, thanx बहुत ज्यादा! –

1

वास्तव में मुझे बहुत मदद मिली है। एक कन्स्ट्रक्टर में एक कंक्रीट क्लास का इस्तेमाल किया जाता है जो इसके कन्स्ट्रक्टर में एक अलग कनेक्शन स्ट्रिंग प्राप्त करता है जिसके आधार पर "पैरेंट" क्लास इसका उपयोग कर रहा है। धन्यवाद।

  ObjectFactory.Initialize(x=> 
            { 
             // Different connection string for each usage 
             // of the RelationalGateway class 
             x.ForRequestedType<RelationalGateway>() 
              .AddInstances(r => 
               r.ConstructedBy(() => 
                new RelationalGateway(ConfigRepository.DataSourceName)) 
              .WithName("config")) 
              .TheDefault.Is.ConstructedBy(
              () => new RelationalGateway(OracleSpatialRepository.DataSourceName)); 

             // Inject the right RelationalGateway 
             x.ForRequestedType<IConfigRepository>() 
              .TheDefault.Is.OfConcreteType<ConfigRepository>() 
              .CtorDependency<RelationalGateway>().Is(inst => 
               inst.TheInstanceNamed("config")); 

             x.ForRequestedType<ISpatialRepository>() 
              .TheDefault.Is.OfConcreteType<OracleSpatialRepository>() 
              .CtorDependency<RelationalGateway>().IsTheDefault(); 

             // Other simple types 
             x.ForRequestedType<IIdGenerator>().TheDefaultIsConcreteType<IdGenerator>(); 
            }); 
संबंधित मुद्दे