Siverlight 应用标准的WCF开发应用程序,WCF+LINQ+SL LINQ动态查询(今日随笔)
2011-12-07 13:35
375 查看
要开发中大型的WCF应用程序,一些基础教程和网上使用WCF +LINQ+SL的方法,简答的还行,如果比较大,就不合适了,WCF的接口声明,一遍一遍的重复写接口,重复的代码就是折磨,就算有CodeSmith,也好不到那里去。前台要写,后台依然要写。主要是查询特别现在感觉特别难搞,只能看看其他人怎么搞,估计可能有好的方法,暂时不知道。
拿验证来说吧,也是手写,CodeSmith怎么弄,没有告诉你数据库的约束和实际的约束完全一致,调整比较麻烦,你还是一个一个的调整,不过能够好很多了。
WCF服务和实现难以分解。IService定义无限多的接口,而XXXService都要一个一个的实现,一个WCF多的难以管理。如果一个领域服务,一个IService管理更加困难,如果使用实现访问其他的静态类,你还得写很多的代码,都是重复的,你的写一个非常好的CodeSmit模板才可以,虽然不难,但是很烦。
你最好删掉Visual Studio 2010生成的接口代码,太垃圾了。把接口删掉就好多了。
如下:
Microsoft.P&P提供的Prism不怎么样,太麻烦,不实用,不过看样子可以大幅度写模板代码并且生成还凑合。
一般的数据库应用,小小的使用WCF+LINQ+SL还一般,验证使用META验证(都懂的),Simple.MVVM没有搞过,不知道。
如果程序使用WCF并且开启了WCF RIA SERIVCE,可能会出现WCF的错误,我整理出来了(Silverlight应用程序中添加WCF服务的问题(整理) )
看样子Microsoft 提供的WCF RIA SERCICE 确实就在解决这个问题。
如果做动态查询使用LINQ怎么处理表达式呢?以下是代码,但是不知道再搞啥玩意,不敢苟同的代码,想天书一样,不赚钱,写多吊的东西都是垃圾,项目不赚钱,越吊越垃圾。(发泄一下了....~~~)
服务端代码:(看到了吧,什么打造LINQ的优美,狗屁,我认为泛型更见泛滥,回调更加毁掉,一句话的代码就是好东西,也许就会有ROR了)
客户端代码:
够吊吧,(心里说话,不是一句话的代码就是垃圾)。
我认为,现在的WCF的例子,还不如使用 看样子Microsoft 提供的WCF RIA SERCICE SP1。
(水平有限,不过拍砖才有进步,欢迎各位品评)
WCF+LINQ+SL,普通小小的组合,异步难度最低,其他的不敢说了。不过要修改接口,这样能够省事点,你想使用,随你。
WCF RIA +LINQ+META+SL一般啦。
WCF RIA+MEF+SL,我感觉最实用,大小均可。
SimpleMVVM+SL感觉公司小了不要搞。
Prism+SL,估计就几个模块可以用,主流方案不推荐。
MVVM隔离了,正如那句话,架构弹性强了,你会牺牲其他的,但是我认为Prism牺牲太多了,就叫劣势了。权衡后,感觉WCF RIA +MEF+SL不错的选择,多大都行。异步问题开发难度也降低了不少。
C#,JAVA这样的框架会不会退出历史舞台。
看看Microsoft Visual Studio LightSwitch (简单,有效最重要)
拿验证来说吧,也是手写,CodeSmith怎么弄,没有告诉你数据库的约束和实际的约束完全一致,调整比较麻烦,你还是一个一个的调整,不过能够好很多了。
WCF服务和实现难以分解。IService定义无限多的接口,而XXXService都要一个一个的实现,一个WCF多的难以管理。如果一个领域服务,一个IService管理更加困难,如果使用实现访问其他的静态类,你还得写很多的代码,都是重复的,你的写一个非常好的CodeSmit模板才可以,虽然不难,但是很烦。
你最好删掉Visual Studio 2010生成的接口代码,太垃圾了。把接口删掉就好多了。
如下:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.ServiceModel.Activation; namespace ReportViewerWithC1Report.Web { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。 [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class Service1 { [OperationContract] public void DoWork() { } } }
Microsoft.P&P提供的Prism不怎么样,太麻烦,不实用,不过看样子可以大幅度写模板代码并且生成还凑合。
一般的数据库应用,小小的使用WCF+LINQ+SL还一般,验证使用META验证(都懂的),Simple.MVVM没有搞过,不知道。
如果程序使用WCF并且开启了WCF RIA SERIVCE,可能会出现WCF的错误,我整理出来了(Silverlight应用程序中添加WCF服务的问题(整理) )
看样子Microsoft 提供的WCF RIA SERCICE 确实就在解决这个问题。
如果做动态查询使用LINQ怎么处理表达式呢?以下是代码,但是不知道再搞啥玩意,不敢苟同的代码,想天书一样,不赚钱,写多吊的东西都是垃圾,项目不赚钱,越吊越垃圾。(发泄一下了....~~~)
服务端代码:(看到了吧,什么打造LINQ的优美,狗屁,我认为泛型更见泛滥,回调更加毁掉,一句话的代码就是好东西,也许就会有ROR了)
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)] public partial class Service1 : IService1 { public void DoWork() { } //=========================================================== /// <summary> /// /// </summary> /// <param name="pred">谓词参数</param> /// <returns></returns> public List<Sys_FieldDict> FindFieldDictByExpr(Expression pred) { DataClasses1DataContext ctx=new DataClasses1DataContext(); IQueryable<Sys_FieldDict> fieldDicts = ctx.Sys_FieldDict; //创建表达式 Expression expr=Expression.Call(typeof(Queryable), "where", new Type[]{ typeof(Sys_FieldDict) }, Expression.Constant(fieldDicts),//转换成常量 pred); var query= ctx.Sys_FieldDict.AsQueryable().Provider.CreateQuery<Sys_FieldDict>(expr); return query.ToList<Sys_FieldDict>(); } //====================================================================== public List<string> DoFindBySelect() { DataClasses1DataContext db=new DataClasses1DataContext(); IQueryable<Sys_FieldDict> fieldDicts = db.Sys_FieldDict; ParameterExpression param = Expression.Parameter(typeof(Sys_FieldDict),"c");//表达式参数 Expression selector=Expression.Property(param,typeof(Sys_FieldDict).GetProperty("TableName"));//表达式查询体 //谓词表达式 Expression pre=Expression.Lambda(selector,param); //调用创建表达式 Expression expr=Expression.Call(typeof(Queryable), "select", new Type[]{ typeof(Sys_FieldDict),typeof(string) }, Expression.Constant(fieldDicts),//转换成常量 pre); //在CreateQuery按照表达式expr进行查询,生成结果IQueryable IQueryable<string> query = db.Sys_FieldDict.AsQueryable().Provider.CreateQuery<string>(expr); return query.ToList<string>(); } public List<Sys_FieldDict> DoFindByWhere(string tableName) { DataClasses1DataContext db=new DataClasses1DataContext(); IQueryable<Sys_FieldDict> fieldDicts = db.Sys_FieldDict; ParameterExpression param = Expression.Parameter(typeof(Sys_FieldDict), "c");//表达式参数 //谓词表达式: where left (filter)?= right(常量) Expression left=Expression.Property(param,typeof(Sys_FieldDict).GetProperty("TableName"));//左侧 Expression right=Expression.Constant(tableName);//右侧 Expression filter=Expression.Equal(left, right);//过滤条件 Expression pred=Expression.Lambda(filter, param); //创建表达式 Expression expr=Expression.Call(typeof(Queryable), "where", new Type[]{ typeof(Sys_FieldDict) }, Expression.Constant(fieldDicts),//转换成常量 pred); //在CreateQuery按照表达式expr进行查询,生成结果IQueryable IQueryable<Sys_FieldDict> query = db.Sys_FieldDict.AsQueryable().Provider.CreateQuery<Sys_FieldDict>(expr); return query.ToList<Sys_FieldDict>(); } //=================================================================
客户端代码:
Service1Client client=new Service1Client(); string tableName=textBox1.Text; //DataClasses1DataContext db=new DataClasses1DataContext(); //IQueryable<Sys_FieldDict> fieldDicts = db.Sys_FieldDict; //这里需要System.Linq.Expressions避免和System.Windows.Expression冲突,写上了空间的原名称 ParameterExpression param =System.Linq.Expressions.Expression.Parameter(typeof(Sys_FieldDict), "c");//表达式参数 //谓词表达式: where left (filter)?= right(常量) System.Linq.Expressions.Expression left=System.Linq.Expressions.Expression.Property(param, typeof(Sys_FieldDict).GetProperty("TableName"));//左侧 System.Linq.Expressions.Expression right=System.Linq.Expressions.Expression.Constant(tableName);//右侧 System.Linq.Expressions.Expression filter=System.Linq.Expressions.Expression.Equal(left, right);//过滤条件 System.Linq.Expressions.Expression pred=System.Linq.Expressions.Expression.Lambda(filter, param); client.FindFieldDictByExprCompleted+=(o,args)=> { List<Sys_FieldDict> list=new List<Sys_FieldDict>(args.Result); dataGrid1.ItemsSource=list; }; client.FindFieldDictByExprAsync(pred);
够吊吧,(心里说话,不是一句话的代码就是垃圾)。
我认为,现在的WCF的例子,还不如使用 看样子Microsoft 提供的WCF RIA SERCICE SP1。
(水平有限,不过拍砖才有进步,欢迎各位品评)
WCF+LINQ+SL,普通小小的组合,异步难度最低,其他的不敢说了。不过要修改接口,这样能够省事点,你想使用,随你。
WCF RIA +LINQ+META+SL一般啦。
WCF RIA+MEF+SL,我感觉最实用,大小均可。
SimpleMVVM+SL感觉公司小了不要搞。
Prism+SL,估计就几个模块可以用,主流方案不推荐。
MVVM隔离了,正如那句话,架构弹性强了,你会牺牲其他的,但是我认为Prism牺牲太多了,就叫劣势了。权衡后,感觉WCF RIA +MEF+SL不错的选择,多大都行。异步问题开发难度也降低了不少。
C#,JAVA这样的框架会不会退出历史舞台。
看看Microsoft Visual Studio LightSwitch (简单,有效最重要)
相关文章推荐
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- iOS开发UI基础—31在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- 综合应用WPF/WCF/WF/LINQ之十:界面开发人员的Solution
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- 综合应用WPF/WCF/WF/LINQ之三十四:在XBAP项目中模拟弹出一个自定义的“模态窗口”
- 实战 Eclipse ,Jigloo, PostgreSQL,JDBC 开发数据库查询应用系统起步
- linq里lambda写的join查询,并附加动态拼接的条件,条件为enum类型的查询
- 如何应用TCP/IP的套接字开发网络通信应用程序
- LINQ 标准的查询操作符 生成操作符 Range()、Empty()和Repear()
- XAF应用开发教程(四)应用程序模型