日期:2014-05-20  浏览次数:20687 次

提问Wcf+Linq+winForm的一些基础问题


由于新项目准备使用一些“新技术”,研究了几天.net,觉得使用wcf+linq还不错。有些基础问题前来询问,望大家帮忙。

1、关于wcf
客户端进行了模块化设计,比如说每一个模块都封装成了单独的dll。于此同时模块需要访问数据时都是通过wcf调用业务组件方式。而客户端各个模块又是相对独立的,如果都调用同一个wcf,就会造成

wcf形成一个巨大的接口%E?UBF??职责不清。

我目前的想法是:将wcf划分成多个服务,通过对外公布不同的服务。客户端dll通过独立引用相关的wcf,从而实现与业务中间层的呼应,这样wcf相对就独立,职责清楚。

形成了:功能模块1-》wcf服务1-》业务逻辑1 这样一个线性的开发模式。

而其中wcf如果采用独立进程作为宿主,如何才能实现不同的服务呢?是否有更好的设计方法?


2、关于Linq
由于软件功能不多,最大的数据表数据量也不过200万,采用sql server数据库,暂时不考虑采用存储过程。

使用Linq可以很简单的实现ORM,而且代码生成也非常简单,但是几天学习下来对Linq即清楚又模糊!

我目前想法是将所有表生成在一个dbml中,这样如果有数据表修改只需要修改一处就可以了。而且数据表也不算多,20个左右。但就是说如果放在一起就会造成一个大的功能类,维护不容易。也不能很

好的加入处理逻辑,我见Linq里面是可以partial到不同的实现单元中实现特殊处理的。


所以比较模糊,如何设计dbml呢?将所有的表都放于一起?有没有好的设计方法?表都在一起会不会有性能影响?

Linq的性能如何?是否有必要与其他的框架结合使用?能否胜任复杂的业务结构?


------解决方案--------------------
技术不是最重要的,重要的下来和结构如何.
dbml,即Database Mark Language。数据库描述语言,是一种xml格式的文档,用来描述数据库。
操作数据库还是要使用 Linq to xml、Linq to objects、Linq to dataset、Linq to entities
参考
------解决方案--------------------
关于第一个问题,建议使用WCF+IIS7+TCP协议,单独模块提供单独的服务接口,公布出来的服务实现提供出来的接口

第二个问题,楼主使用linq to Sql。。可以建议使用linq to entity 原理应该一样,单独模块都有个单独的数据层。
------解决方案--------------------
回答你第一个问题。

架构师设计WCF或者别的什么通讯架构,跟客户端无关。不论你服务器端是一个WCF服务还是10个,或者把功能分布于多个网站,都是根据服务端开发组织来确定。这方面,客户端开发就像是“佣人”一样,要根据主人的安排来使用接口。唯一的权利是,一旦形成文档,那么服务器端就不应该撤销远程访问接口,即使服务器端重新组织架构,也要维护原来的远程访问接口(在服务内部进行转换和对新的实现方式的适配)。

虽然说架构师应该有丰富的客户端开发经验(有丰富的低级c/s系统开发经验),但是设计高级的远程通讯接口时不要纠缠客户端开发的意见。你可以把客户端开发者排除在系统之外,等服务接口规格文档指定之后,才开始招标客户端开发人员。
------解决方案--------------------
你的第二个问题我看不懂。怎么会想出“表都在一起会不会有性能影响”这个主意?我们平时多写几百个类放到一个程序里都不会有什么性能影响的,你才多出20几个而已。

关于是否使用 Linq to SQL,事实上即使 Linq to SQL 是通过 Linq to xxxx 来间接实现的,我也不会因为这个就放弃使用 Linq to SQL 而去使用 Linq to xxxx。道理很简单,如果高级语言都可以编译为汇编语言,你会因为这个原因就眼里只有汇编语言而从此不用高级语言吗?!除非我知道 Linq to xxxx 的比Linq to SQL更简洁和逻辑性表达力更强,或者确实有成倍的效率提高,才会使用。

所以没有开发战略的人才会追逐个别语句的执行“效率”这种蝇头小利,战略开发者追逐通过业务逻辑和新的架构来对整个系统比成倍地提高效率,而不是为了提高百分之一、二的效率而毁掉系统的扩展和重构的能力。
------解决方案--------------------
哦当然啦,对于底层的移植问题,我的观点是“一定要自己亲自实现”一种DAL接口,而不要受制于人(包括不要受制于.net framework)。例如我在帖子 http://topic.csdn.net/u/20090813/13/5ACF3E68-0AD7-4D12-827A-FF7FEECB1790.html 写了一个IDomain接口,他就可以使用Linq to SQL写不足50行代码就能实现,建议你试一试,可以发现Linq to SQL的更多本质。


关于你的第一个问题,我也要多说几句。客户端应用程序应该访问一个BLL层代码,这个层中隐藏了BLL的具体实现,是用本地数据库、用一个基于内存中的集合来“假扮”数据库(用于快速开发调试),还是访问远程的WCF服务,具体实现形式应该与表现层的代码分开。不要在表现层代码中直接写任何访问WCF服务的代码。

这样,BLL其实也是很小的,同时表现层因为访问BLL,也就避免将来大规模修改底层计算和访问存储的代码。

------解决方案--------------------
探讨
引用:
关于第一个问题,建议使用WCF+IIS7+TCP协议,单独模块提供单独的服务接口,公布出来的服务实现提供出来的接口

第二个问题,楼主使用linq to Sql。。可以建议使用linq to entity 原理应该一样,单独模块都有个单独的数据层。


嗯。wcf觉得问题主要是在于如何实现,至于IIS7可能不能使用,目前准备使用NT服务或者独立程序做宿主。

第二个问题,看来有必要去了一下Linq to entities。