Siverlight 应用标准的WCF开发应用程序,WCF+LINQ+SL LINQ动态查询(今日随笔)

来源:互联网 发布:php购物车 编辑:程序博客网 时间:2024/04/28 11:56

        要开发中大型的WCF应用程序,一些基础教程和网上使用WCF +LINQ+SL的方法,简答的还行,如果比较大,就不合适了,WCF的接口声明,一遍一遍的重复写接口,重复的代码就是折磨,就算有CodeSmith,也好不到那里去。前台要写,后台依然要写。主要是查询特别现在感觉特别难搞,只能看看其他人怎么搞,估计可能有好的方法,暂时不知道。

       拿验证来说吧,也是手写,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 (简单,有效最重要)

原创粉丝点击