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的主要功能至此就介紹完了。歡迎使用。別忘了,它是開源的,現在就去下載吧!