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


猜你喜欢

转载自blog.csdn.net/marshal1991415/article/details/23370361