前两篇文章介绍了如何使用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的主要功能至此就介绍完了。欢迎使用。别忘了,它是开源的,现在就去下载吧!