1. 程式人生 > >SharePoint Entity Framework 3 – 自定義轉換邏輯

SharePoint Entity Framework 3 – 自定義轉換邏輯

前兩篇文章介紹瞭如何使用SharePoint Entity Framework來關聯和轉換SharePoint內建欄位。此外,SharePoint Entity Framework還提供了幾種擴充套件機制來幫助我們自定義轉換邏輯、適配自定義欄位以及自定義屬性型別。

自定義轉換邏輯

在第一篇文章中曾經提到過,Entity類包含一個Read方法和一個Write方法,分別用來讀入列表項和寫入列表項。實際上這是兩個虛方法,我們在編寫實體類的時候,可以根據需要重寫這兩個方法,加入自己的邏輯。

比如下面的這個實體類:

public class SampleEntity: Entity
{      [Field( "Field1" )]      public int Property1 { get ; set ; }        public string Price { get ; set ; }        public
override void Read(Microsoft.SharePoint.SPListItem item, Microsoft.SharePoint.SPRegionalSettings regionalSettings = null )      {          base .Read(item, regionalSettings);           
this .Price = "$" + item[ "Money" ].ToString();      }        public override void Write(Microsoft.SharePoint.SPListItem item, Microsoft.SharePoint.SPRegionalSettings regionalSettings = null )      {          base .Write(item, regionalSettings);            item[ "Money" ] = double .Parse( this .Price.Substring(1));        } }

此SampleEntity類重寫了基類的Read和Write方法,在其內部添加了處理Money欄位的轉換邏輯,將該欄位與Price屬性相互轉換。需要注意的是Price屬性並沒有被FieldAttribute或其任何子類修飾,這是因為該屬性並不需要被SharePoint Entity Framework的預設轉換機制來處理。

而Property1則通過FieldAttribute關聯到了Field1欄位,所以該屬性會通過SharePoint Entity Framework的預設轉換機制來處理。需要注意的是如果重寫了Read或Write方法,但卻沒有在其內部呼叫父類的相應方法的話,SharePoint Entity Framework的預設轉換機制就會被遮蔽掉。

適配自定義欄位

SharePoint Entity Framework支援絕大多數SharePoint內建欄位型別,也提供了機制來關聯和轉換我們開發的自定義欄位。

假設SampleEntity中包含這樣一個屬性:

  [Field( "CustomField" )] public string Value { get ; set ; }

CustomField是一個自定義欄位,其實現如下所示:

  public class CustomField : SPField {      public override Type FieldValueType      {          get          {              return typeof (CustomFieldValue);          }      }        public CustomField(SPFieldCollection fields, string fieldName) : base (fields, fieldName){ } }   [Serializable] public class CustomFieldValue {      public string Value { get ; set ; }        public CustomFieldValue(){ }        public CustomFieldValue( string value)      {          this .Value = value;      }        public override string ToString()      {          return this .Value;      } }

如果想要SharePoint Entity Framework的預設轉換機制能識別並自動處理此欄位,就需要為其編寫一個轉換器。在SharePoint Entity Framework中,所有轉換器都需要實現IValueConverter介面(位於WindStyle.SPEntity.Converters名稱空間),如下面的程式碼所示:

  using WindStyle.SPEntity.Converters;   public class CustomFieldConverter : IValueConverter {      public object ToFieldValue( object value, Type targetType, ConversionContext context)      {          return new CustomFieldValue(value as string );      }        public object ToPropertyValue( object value, Type targetType, ConversionContext context)      {          if (targetType == typeof ( string ))          {              return (value as CustomFieldValue).Value;          }          return null ;      } }

IValueConverter介面包含的ToFieldValue和ToPropertyValue方法分別會被用來將屬性值轉換為欄位值和將欄位值轉換為屬性值,其value引數表示原始值,targetType引數表示要轉換到的目標型別,context則提供了一些有助於精確轉換的上下文資訊,比如SPListItem、SPRegionalSettings和屬性所應用的具體FieldAttribute,可以根據需要來使用。

接下來通過ConverterAttribute將自定義欄位和轉換器關聯起來:

  using WindStyle.SPEntity.Attributes;   [Converter( typeof (CustomFieldConverter))] public class CustomField : SPField {      //… }

至此,SharePoint Entity Framework就可以正確識別並處理CustomField欄位了。每次執行SampleEntity的Read或Write方法,SharePoint Entity Framework都會使用CustomFieldConverter來讀入CustomField欄位中的值(或將值寫入到CustomField欄位),就像它是一個SharePoint內建欄位一樣。

適配自定義屬性型別

ConverterAttribute和IValueConverter這套機制除了可以適配自定義欄位之外,還可以適配自定義屬性型別,並且用法一模一樣。

下面通過程式碼示例來演示一下使用方法,假設SampleEntity中包含這樣一個屬性:

  [Field( "Field2" )] public CustomProperty Property1 { get ; set ; }

CustomProperty是一個自定義型別,其實現如下所示:

  [Converter( typeof (CustomPropertyConverter))] public class CustomProperty {      public char [] Chars { get ; set ; } }

關聯到CustomProperty的轉換器型別是CustomPropertyConverter,其實現如下面的程式碼所示:

  public class CustomPropertyConverter : IValueConverter {      public object ToFieldValue( object value, Type targetType, ConversionContext context)      {          return new string ((value as CustomProperty).Chars);      }        public object ToPropertyValue( object value, Type targetType, ConversionContext context)      {          return new CustomProperty()          {              Chars = value.ToString().ToCharArray()          };      } }

唯一需要注意的是SharePoint Entity Framework在選擇轉換器時,會優先考慮屬性型別所指定的轉換器。當屬性型別沒有指定轉換器時,才會去根據FieldAttribute找到屬性所關聯的欄位型別,然後再根據它來找到合適的轉換器。

SharePoint Entity Framework的主要功能至此就介紹完了。歡迎使用。別忘了,它是開源的,現在就去下載吧!