2011-07-11 14 views
0

我正在構建一個應用程序,其中數據模型是固定的,但人們(或者我)可以通過添加從基類繼承的類來擴展它,該類從信息中實例化數據庫和序列化的服務。爲某些字段值和其他擴展點添加處理程序

我有三個問題領域與此(案例1 2和3在下面的示例代碼)。案例#1我也許可以通過一個界面來解決,但這並不能幫助我處理案例2或3.

我認爲代碼示例會說得比我嘗試解釋的要好;任何想法如何解決這個問題,以便每個新的字段類型不需要手動添加到代碼中的一堆地方?

public class ManagerClass 
{ 
    public ManagerClass() 
    { 

     public ManagerClass() 
     { 
     } 

     //Case #1 
     public void process(AllFields allFields) 
     { 
      foreach (Field field in allFields.Fields) 
      { 
       //Currently I need to add all extention types as seperate cases here manually 
       //...this type of logic appears in several places in the code 
       if (field.GetType().Name == "ExtendedField") 
       { 
        //Have the extended field do something in a way particular to it 
       } 
       else 
       { 
        //Have the base field do something the "normal" way 
       } 
      } 
     } 
     //Case #2 
     //Here is another case where currently I am adding each case in by hand 
     //fieldType is a string here because I am storing what type of field it is in the DB 
     public void create(string value, string fieldType) 
     { 
      //Currently I need to add all extention types as seperate cases here manually 
      if (fieldType == "ExtendedField") 
      { 
       //Create a ExtendedField 
      } 
      else 
      { 
       //Create a Field 
      } 
     } 
    } 
} 

[DataContract] 
//Case #3 
[KnownType(typeof(ExtendedField))] //Currently I need to add all extention types here manually 
public class AllFields 
{ 
    private List<Field> fields; 
    public AllFields(){} 

    [DataMember] 
    public List<Field> Fields 
    { 
     get { return fields; } 
     set { fields = value; } 
    } 
} 

[DataContract] 
public class Field 
{ 
    private string fieldValue; 
    public Field(){} 

    [DataMember] 
    public string FieldValue 
    { 
     get { return fieldValue; } 
     set { fieldValue = value; } 
    } 
} 

[DataContract] 
public class ExtendedField : Field 
{ 
    private string someOtherAttribute; 
    public ExtendedField(){} 

    [DataMember] 
    public string SomeOtherAttribute 
    { 
     get { return someOtherAttribute; } 
     set { someOtherAttribute = value; } 
    } 
} 
+0

我發現我也可以通過配置文件,這對我來說工作正常序列化部分添加已知類型,以及:http://msdn.microsoft.com/en-us /library/ms730167.aspx – Amasuriel

回答

2

聽起來就像你正試圖構建一個微型可擴展性框架。考慮這樣的事情出擴展邏輯由FieldHandler處理:

public class FieldHandler 
{ 
    public virtual Field CreateField(string value, string fieldType){...} 
} 

// Case 2 
Field field = null; 
foreach (FieldHandler handler in m_handlers) 
{ 
    if (handler.SupportsFieldType(fieldType)) 
    { 
     field = handler.CreateField (value, fieldType); 
     continue; 
    } 
} 
if (field == null) 
{ 
    // Create standard field. 
    field = ...; 
} 
+0

擴展類型如何向域處理程序註冊自己,以便在該循環期間獲取它們? – Amasuriel

+0

好問題。您可以在配置文件中指定它,或使用反射來加載目錄中的所有程序集,並查找擴展FieldHandler的任何類型。有很多選擇,但我很難說,因爲我對你的項目知之甚少。 –

+0

我想我明白這是如何工作的。如果我無法弄清楚實施情況,我會詢問後續情況。 – Amasuriel

2

可擴展字段閱讀:

使得現場一個抽象類,讓你的所有常用的方法抽象爲好。派生自Field的類將精確指定這些方法的功能。

然後,您可以將這些派生類的對象傳遞迴接受Field的方法,並且可以調用Field的方法而無需擔心正在使用的實際類。界面會更好,但是你不會爲了通用功能而重用代碼。

可擴展字段創建:

你將永遠有你的程序來確定創建哪個類的界限的地方做一個開關什麼的。你的目標是隻在一個地方做到這一點。您的設計 - 根據數據庫中的數據確定使用的工廠方法 - 非常理想。

研究創建一個有責任根據DB數據創建Field對象的類並傳遞它。如果它是抽象的,你可以對它進行子類化並將它作爲參數傳遞給方法,這些方法通過調用類似fieldFactory.GetNewField(myParameter);來獲得他們想要的數據。

對於可擴展序列化:

Research DataContractResolver。

提示:

如果你發現自己不得不在多個地方(在構造函數的調用)上的字段的類型切換,你這樣做是錯誤的。一個例子就是你的過程(場)方法。相反,Field或者IField應該有一個抽象的Process方法。消費者只需調用Field.Process,而不關心它是如何實現的。

例子:

​​
+0

這是很好的信息,謝謝。 – Amasuriel

相關問題