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

发表评论

电子邮件地址不会被公开。 必填项已用*标注