实现目标:
可以灵活方便地实现数据绑定。
OrderSearch search = FormContext.BindObject
Orders order = FormContext.BindObject
制定规则和约束
首先确定WEB提交的数据和成员属性的映射关系,可以通过名称约定的方式:
xxxx.LastName、xxxx_LastName或xxxxLastName等。在绑过程可以指定前缀进行对象成员的绑定;不过在webForm控件的Name是asp.net生成的,在关系分析上就相对复杂些。
类型转换接口的定义
因为转换的情况是很难确定;除了。NET的基础类型外实际应用中还会存在其他转换方式,如:HttpPostedFile到byte[],序列化String到Object等。因此制定转换接口就可以方便实现可扩展和可配置。
public interface IStringConverter
{
object ConvertTo(string value, out bool succeeded);
}
由于Web提供的数据大部份是以string的方式提供,因此定义一个基于string转换描述。基于接口的实也很简单:
public class ToSbyte :IStringConverter
{
#region IStringConverter 成员
object IStringConverter.ConvertTo(string value, out bool succeeded)
{
sbyte nvalue;
succeeded = sbyte.TryParse(value, out nvalue);
return nvalue;
}
#endregion
}
IStringConverter工厂的实现
由于转换情况的不确定性,因此通过工厂的方式来达到代码对外的封闭性和良好的扩展性。可以通过目标类型来获取相关转换实例,在.NET中IDictionary就能够达到应用的要求。
static IDictionary mConverters;
public static IDictionary Converters
{
get
{
if (mConverters == null)
{
lock (typeof(ConverterFactory))
{
OnInit();
}
}
return mConverters;
}
}
static void OnInit()
{
if (mConverters != null)
return;
mConverters = new Dictionary();
mConverters.Add(typeof(byte), new ToByte());
LoadConfig();
}
//从配置文件加载转换器映射,如果配置存在相同类型转器就取代原有转换器
static void LoadConfig()
{
//Load Config
//
}