2012-07-27 62 views
0

您好我的工廠代碼是這樣的。而不是直接存儲在字典中,我想將這些值存儲在app.config文件中。如下所示。抽象工廠添加到字典從配置

public class HandlerFactory 
    { 
     private Dictionary<string, IHandler> _handlers = new Dictionary<string,IHandler>(); 
     public HandlerFactory() 
     { 
      _handlers.Add("AMOUNT", new AmountValidator()); 
      _handlers.Add("FLOW", new FlowValidator()); 
     } 
     public IHandler Create(string key) 
     { 
      IHandler result; 
      _handlers.TryGetValue(key, out result); 
      return result; 
     } 
    } 

我想將這些設置移動到我的配置文件中,如下所示。

<?xml version="1.0" encoding="utf-8" ?> 
     <configuration> 
     <configSections> 
      <section name="Indentifiers" type="System.Configuration.AppSettingsSection"/> 
     </configSections> 
     <Indentifiers> 
      <add key="AMOUNT" value="AmountValidator" /> 
      <add key="FLOW" value="FlowValidator" /> 
     </Indentifiers> 
    </configuration> 

我正在做這樣的事情,但我沒有成功。不知道如何添加到字典

NameValueCollection settings = ConfigurationManager.GetSection("Indentifiers") as NameValueCollection; 
       if (settings != null) 
       { 
        foreach (string key in settings.AllKeys) 
        { 
         _handlers.Add(key.ToString(), settings[key].ToString()); <-- how to handle here 
        } 
       } 
+1

'Activator.CreateInstance'應該在這裏有用。 – ChaosPandion 2012-07-27 19:04:08

+0

喂混沌,我在我的主類而不是工廠類調用createInstance。在我的主類中,我正在做這樣的事情'IHandler validator = handle.Create(arInfo [0] .ToString()); (IHandler)Activator.CreateInstance(「Validation」,validator.ToString())。Unwrap();'但我不明白如何將鍵的值轉換爲IHandler類型。即。從我的工廠類中'AmountValidator'到'Ihandler類型的AmountValidator'。你懂我的意思了嗎?你能給些建議麼? – bayyinah 2012-07-28 06:22:20

+0

我認爲你不瞭解工廠的目的。想想第二個的定義。汽車工廠會製作一輛汽車或一輛真正的汽車的藍圖嗎? – ChaosPandion 2012-07-28 06:26:51

回答

0

正如ChaosPandion指出的,CreateInstance方法應該是有用的。 假設這兩種處理程序類型的實現IHandler,它們是位於運行的程序集,

_handler.Add(key.ToString(), Activator.CreateInstance(null, settings[key].ToString())); 

應該做的伎倆! http://msdn.microsoft.com/en-us/library/d133hta4.aspx 第一個參數是程序集的名稱,null默認爲正在執行的程序集。

+0

嗨olagjo,我不想在我的工廠類上創建實例,而是在我的主類中做。如圖所示'HandlerFactorys handle = new HandlerFactorys();如果(handle.isValid(arInfo [0] .ToString())) IHandler validator = handle.Create(arInfo [0] .ToString()); IHandler handler =(IHandler)Activator.CreateInstance(「Validation」,validator.ToString())。Unwrap(); handler.Validate(Message); }'但是,當我從配置文件讀取時,如何將字符串轉換爲Type Ihandler?你有沒有得到我的問題? – bayyinah 2012-07-28 06:16:30

0
public interface IHandler 
{ 
    void Handle(); 
} 

public sealed class HandlerFactory 
{ 
    private readonly Dictionary<string, Type> _map = new Dictionary<string, Type>(); 

    public HandlerFactory() 
    { 
     var handlers = (NameValueCollection)ConfigurationManager.GetSection("Handlers"); 
     if (handlers == null) 
      throw new ConfigurationException("Handlers section was not found."); 
     foreach (var key in handlers.AllKeys) 
     { 
      var typeName = handlers[key] ?? string.Empty; 
      // the type name must be qualified enough to be 
      // found in the current context. 
      var type = Type.GetType(typeName, false, true); 
      if (type == null) 
       throw new ConfigurationException("The type '" + typeName + "' could not be found."); 
      if (!typeof(IHandler).IsAssignableFrom(type)) 
       throw new ConfigurationException("The type '" + typeName + "' does not implement IHandler."); 
      _map.Add(key.Trim().ToLower(), type); 
     } 
    } 

    // Allowing your factory to construct the value 
    // means you don't have to write construction code in a million places. 
    // Your current implementation is a glorified dictionary 
    public IHandler Create(string key) 
    { 
     key = (key ?? string.Empty).Trim().ToLower(); 
     if (key.Length == 0) 
      throw new ArgumentException("Cannot be null or empty or white space.", "key"); 
     Type type; 
     if (!_map.TryGetValue(key, out type)) 
      throw new ArgumentException("No IHandler type maps to '" + key + "'.", "key"); 
     return (IHandler)Activator.CreateInstance(type); 
    } 
} 
+0

感謝混沌,我在'類型'Validation.BuyValidator'沒有實現IHandler,即使它實現了IHandler。我的配置文件是這樣 \t \t <添加鍵= 「買入」 值= 「Validation.BuyValidator」/> \t \t <添加鍵= 「賣」 值= 「Validation.SellValidator」/> \t – bayyinah 2012-07-28 07:47:32

+0

@bayyinah - 如果仔細觀察我的原始代碼,你會注意到if語句檢查是否需要實現IHandler否定。 – ChaosPandion 2012-07-28 08:09:57