2013-07-15 134 views
1

對於我的應用程序,我試圖編寫一個配置控制器來加載和保存某些模塊的設置。爲此,我將使用INI文件,其中段名稱將表示模塊名稱(或其他標識)以及由鍵表示的值。獲取模塊名稱或標識

我在自舉程序中註冊了我的控制器,並在適當的類中使用我的構造函數中的接口進行注入。不過,我不想每次需要獲取或設置一個值時輸入模塊名稱,所以我嘗試使用調用者信息來找出哪個模塊(或類)正在調用該方法,但這顯然不起作用(返回空字符串)。

是否有另一種方法來實現我想要做的?

引導程序:

protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 

     Container.RegisterType<IConfig, ConfigController>(new ContainerControlledLifetimeManager()); 
    } 

配置接口:

public interface IConfig 
{ 
    string[] GetSettings(string caller = ""); 

    void Set<T>(string setting, T value, string caller = "") where T : class; 
    T Get<T>(string setting, string caller = "") where T : class; 
} 

回答

1

使用呼叫者說法是容易出錯。您有許多選項可以避免它:

  1. 爲每個模塊註冊一個ConfigController。 Unity支持多個命名註冊。您可以在每個模塊中注入合適的控制器模塊初始化,或用Dependency屬性:

     Container.Register<IConfig, ConfigController>("module1", 
          new InjectionConstructor("module1")) 
           .Register<IConfig, ConfigController>("module2", 
          new InjectionConstructor("module2")); 
    
         class Module1 { 
          public Module1([Dependency("module1")] IConfig config) {... } 
         } 
    
  2. 定義和實現,它返回一個配置IConfig實施IConfigFactory。

    interface IConfigFactory { 
         IConfig Create(String moduleName); 
        } 
    
  3. ConfigController可以識別模塊detecting the method the made the call

+0

我決定使用第一個建議,它的作品就像一個魅力!仍試圖找到一種方法來註冊控制器在boostrapper中,而不是在模塊本身,但似乎無法得到在初始化之前在DirectoryModuleCatalog中的模塊。無論如何非常感謝,這絕對讓我回到正軌:) – Kryptoxx