您的位置:首页 > 其它

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生成的接口代码,太垃圾了。把接口删掉就好多了。

如下:

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 (简单,有效最重要)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐