2009-08-15 6 views
5

स्ट्रक्चर मैप रजिस्ट्रार कन्स्ट्रक्टर के अंदर मुझे कुछ प्रकार (एक अलग रजिस्ट्री में पंजीकृत) का उदाहरण कैसे प्राप्त हो सकता है? मैं इस तरह के कोड का उपयोग करना चाहता हूं:मैं स्ट्रक्चर मैप रजिस्ट्रार कन्स्ट्रक्टर में एक उदाहरण कैसे प्राप्त कर सकता हूं?

public RepositoriesRegistry() 
    { 
     IApplicationSettings lApplicationSettings = 
      ObjectFactory.GetInstance<IApplicationSettings>(); 
     Debug.Assert(lApplicationSettings != null); 

     const string cSupportedDevicesConnectionString = 
      "metadata=res://*/Models.SupportedDevices.Database.SupportedDevicesModel.csdl|res://*/Models.SupportedDevices.Database.SupportedDevicesModel.ssdl|res://*/Models.SupportedDevices.Database.SupportedDevicesModel.msl;provider=System.Data.SqlClient;provider connection string=\"{0}\""; 
     string lSupportedDevicesConnectionString = 
      string.Format(cSupportedDevicesConnectionString, lDatabaseConnectionString); 
     SupportedDevicesEntities lSupportedDevicesEntities = 
      new SupportedDevicesEntities(lSupportedDevicesConnectionString); 
     ForRequestedType<SupportedDevicesEntities>().TheDefault.IsThis(
      lSupportedDevicesEntities); 
     ForRequestedType<ISupportedDevicesRepository>().TheDefault.IsThis(
      new SupportedDevicesRepository(lSupportedDevicesEntities)); 

    } 

IAplicationSettings एप्लिकेशन सेटिंग्स के लिए एक इंटरफेस है। ठोस इस इंटरफेस (वर्तमान में ConfigFileApplicationSettings वर्ग) को लागू करने प्रकार एक और रजिस्ट्री में पंजीकृत है इस तरह:

public ApplicationServicesRegistry() 
    { 
     ForRequestedType<IApplicationSettings>().TheDefault.IsThis(
      new ConfigFileApplicationSettings()); 
    } 

और दोनों रजिस्ट्रियों Bootstrapper में पंजीकृत हैं:

 #region IBootstrapper Members 

    public void BootstrapStructureMap() 
    { 
     ObjectFactory.Initialize(InitalizeStructureMapContainer); 
    } 

    #endregion 

    #region Private properties 

    private static bool HasStarted { get; set; } 

    #endregion 

    #region Private methods 

    private void InitalizeStructureMapContainer(IInitializationExpression x) 
    { 
     x.IgnoreStructureMapConfig = true; 
     x.AddRegistry<ViewModelRegistry>(); 
     x.AddRegistry<ApplicationServicesRegistry>(); 
     x.AddRegistry<RepositoriesRegistry>(); 
     x.AddRegistry<DataOperationsRegistry>(); 
    } 

    #endregion 

जब मैं का एक उदाहरण प्राप्त करने की कोशिश रजिस्ट्री कन्स्ट्रक्टर में IAplicationRegisty मुझे एक त्रुटि मिली है (बेशक)। मैं समझ में नहीं आता कि स्ट्रक्चर मैप का सही तरीके से उपयोग कैसे करें। हो सकता है कि मुझे कुछ अलग तरीके से करना चाहिए। लेकिन फिर भी मुझे रजिस्ट्री कन्स्ट्रक्टर में पंजीकृत कुछ प्रकार के उदाहरण मिल सकते हैं?

उत्तर

7

आज मैं इसी समस्या में भाग गया। जेरेमी मिलर का जवाब (कोई संबंध नहीं :)) यह है कि संरचना मैप कॉन्फ़िगरेशन समय पर उदाहरण बनाने के लिए सेटअप नहीं है।

वह जिस कामकाज की सिफारिश करता था और जिसका उपयोग मैंने सेटिंग्स के लिए एक कंटेनर बनाने के लिए किया था। मेरा समाधान यहाँ है।

public class SettingsRegistry : Registry 
{ 
    public SettingsRegistry() 
    { 
     ForRequestedType<ISettingsProvider>().TheDefault.Is.OfConcreteType<AppSettingsProvider>(); 

     Scan(s => 
     { 
      s.TheCallingAssembly(); 
      s.With<SettingsScanner>(); 
     }); 
    } 
} 

public class RegistryNeedingSettings : Registry 
{ 
    public RegistryNeedingSettings() 
    { 
     var settingsContainer = new Container(new SettingsRegistry()); 
     var coreSettings = settingsContainer.GetInstance<CoreSettings>(); 

     //configuration needing access to the settings. 
    } 
} 

मैं अपनी ही रजिस्ट्री में सब कुछ सेटिंग्स में ले जाया गया और यह सुनिश्चित करें सेटिंग्स रजिस्ट्री निर्भर रजिस्ट्री से पहले से कॉन्फ़िगर किया जाता है बनाया है।

उम्मीद है कि इससे मदद मिलती है।