2012-03-07 108 views
2

不知道如何實現這樣的場景:C#建築 - 設計模式

我有一個基類讓我們說

public abstract class ConfigurationBase 
    { 
    public int Id {get; set;} 

    public string Name {get; set;} 

    } 

和幾個派生類

public class Config1 : ConfigurationBase 
    { 
    public string Url {get;set;} 
    public string ReferrerUrl {get; set;} 
    } 


    public string Config2 : ConfigurationBase 
    { 
    public string Domain {get; set;} 
    public bool AllowCookie {get; set;} 
    } 

ConfigurationService它得到用不同的參數調用。

的想法是,根據參數範圍內構建配置Config1或配置Config2或實例等

所以,問題是怎麼能這樣用代碼來實現?

根據相同的條件,實例化某種類型。

到目前爲止,一種想法或者我們如何做到這一點,就是將完全限定類型存儲在數據庫中並通過反射進行構建。

我有點不願意使用這種方法,我問是否還有其他答案。

+0

爲什麼不去功能性編程?這是多麼無聊的繼承東西:) – Yavar 2012-03-07 09:53:10

+0

對不起,但問題標題 - '架構設計模式'獲得了太多的關注。只是「設計模式」會對問題的要求做更多的公正。 – 2012-03-07 10:26:28

回答

1

如果你擁有所有的ConfigurationBase通過實例化他們的子類和規則的知識都是一樣的,那麼你應該尋找一個Factory模式。

如果您不具備所有子類的知識,那麼您需要從數據存儲庫(不一定是數據庫)中動態獲取類型並在運行時對其進行實例化。

如果您不知道實例化對象的所有規則,則需要從數據存儲中提取規則並執行它們。

很明顯,越是動態,你就越需要處理更復雜的事情。

2

工廠模式如何?

編輯:意識到你不想保留單獨的方法,在這種情況下,你將需要一個枚舉(至少)+一個(醜)方法接受所有可能的參數(即表中的列)

public class ConfigurationService { 

     private ConfigurationBase CreateConfig1(string id, string name, string url, string referenceUrl){...} 

     private ConfigurationBase CreateConfig2(string id, string name, string domain, bool allowCookie){...} 

     public ConfigudationBase CreateConfig(string id, string name, string domain, bool allowCookie, string url, string referenceUrl, ConfigType configTypeEnum){ 
      //call the expected factory method based on enum type. 
     } 
    } 
+1

如果因子方法的簽名發生變化,我會使用方法重載並調用簡單的CreateConfig方法。無論如何+1 – dowhilefor 2012-03-07 09:47:46

4

我認爲正確的方法是創建一個factory class,處理創建您的配置對象:

public class ConfigurationFactory { 
    public ConfigurationBase GetConfig(object[] parameters) 
     // Build your objects here according to your params... do stuff... 
     if (parameters[0] ...) 
      return new Config2(...); 
     elseif ... 
      return new Config1(...); 
    } 
} 

然後調用該方法與參數

ConfigurationFactory factory = new ConfigurationFactory(); 
ConfigurationBase config = factory.GetConfig(parameters); 

即使這種方法需要知道如何創建不同的物體,它只集中在一個地方,因此可以很容易地進行更改。

另外,您可能需要定義一個更通用的接口來定義如何獲取配置數據,以便在不知道具體類型的情況下處理對象。

希望幫助

1

一個相當奇怪的想法:)所以不要怪我,是建立一個不同參數類型的哈希值並存儲哈希值和特定配置類型的內部字典。所以工廠方法可以是params,然後建立散列值,從字典create中檢索配置類型並使用反射傳遞參數並返回它。

我不得不說,我的所有想法都圍繞着反射來解決:)

+0

反思可能確實是解決這類複雜問題的方法。 – 2012-03-07 09:52:51

+0

是的,但這個問題不是那麼複雜......而是相當普遍。 – 2012-03-07 09:54:18

+0

我個人使用反射,即使是簡單的任務和問題。我只是確保它在一個地方,它不會影響性能。就像「每一幀」或「內循環」或循環。如果是在加載內容的時候,或者在後臺加載,那麼更簡單的方法就會超過可能的小性能命中率。 – dowhilefor 2012-03-07 09:56:49