当在Web页面中设计好表格布局之后,运用Enterpris Solution提供的框架,以可视化的方式绑定数据。
首先,请在配置文件中添加如下的程序集引用,以方便框架运用反射找到当前项目所引用的实体层。
然后打开Visual Studio,在设计时面板中,选择一个控件。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' title="image" alt="image" border="0" src="/uploadfile/201301/5/72152621406.png" />
如上图所示,选择控件的DataBindingString属性,在属性面板中打开它。如果已经绑定了属性,它会自动高亮显示已经绑定的实体及其属性。这个属性的代码设计,是这样的
- [Category(CategoryName.OPTIONS)]
- [DefaultValue("")]
- [Description("Data Binding")]
- [Editor(typeof(QueryBindingTypeDialogEditor), typeof(UITypeEditor))]
- public virtual string DataBindingString
- {
- get
- {
- object obj = XState["DataBindingString"];
- return obj != null ? obj.ToString() : "";
- }
- set
- {
- XState["DataBindingString"] = value;
- }
- }
如代码所示,它提供了一个自定义的属性编辑器,也就是上图中我们看到的Query Builder,绑定属性。
返回所需要绑定属性的关键代码如下所示,它读取实体层程序集并返回用户所选择的属性值
- string path = "";
- IWebApplication webApp = (IWebApplication)provider.GetService(typeof(IWebApplication));
- Configuration config = webApp.OpenWebConfiguration(true);
- AppSettingsSection app = config.AppSettings;
- path = app.Settings["Assembly"].Value;
这几句代码的含义,从当前Web项目中打开Web.config配置文件,并找到文章开头设置的实体层程序集。
代码生成
基于模板的代码生成器,例如Code Smith,给代码生成带来了极大的便利。Enterprise Solution相关的代码生成,均以Code Smith模板完成。熟悉ASP.NET的语法,应该可以很快熟悉Code Smith的语法并对它的生产力感到满意。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' title="image" alt="image" border="0" src="/uploadfile/201301/5/38152621163.png" />
在最新版本的Code Smith 6.5中,支持.NET 3.x/4.0语法。还可以运用它的SDK,把代码生成功能集成到自己的开发工具中。比如,我想制作一个批量代码生成的工具,直接调用Code Smith的模板文件:
- public void RunTemplate(string templateFile,string connectionString,string tableName,string targetFile)
- {
- CodeTemplateCompiler compiler = new CodeTemplateCompiler(templateFile);
- compiler.Compile();
- if (compiler.Errors.Count == 0)
- {
- CodeTemplate template = compiler.CreateInstance();
- DatabaseSchema database = new DatabaseSchema(new SqlSchemaProvider(), connectionString);
- TableSchema tableSchema = database.Tables[tableName];
- //如果都是字符串,应该要考虑bool,int,object
- Dictionary<string, object> dic = new Dictionary<string, object>();
- string[] paramterValues = rtfParameter.Lines;
- foreach (string parm in paramterValues)
- {
- if (!String.IsNullOrEmpty(parm))
- {
- string[] values = Regex.Split(parm, "=");
- string key = values[0];
- object para =values[1].ToString().Trim();
- if (string.IsNullOrEmpty(values[1]))
- para = tableSchema;
- dic.Add(values[0], para);
- }
- }
- PropertyInfo[] pis = template.GetProperties();
- foreach (PropertyInfo pi in pis)
- {
- object val=null;
- if(dic.TryGetValue(pi.Name,out val))
- template.SetProperty(pi, val);
- }
- if(File.Exists(targetFile))
- File.Delete(targetFile);
- using (StreamWriter writer = new StreamWriter(targetFile))
- {
- template.Render(writer);
- writer.Flush();
- }
- }
- }
这