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

        要开发中大型的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 (简单,有效最重要)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值