使用WCF做为后台服务,如何访问数据库?
我是这么想的,我做的项目一方面要采用数据库存储数据,但另一方面还有对数据库中数据进行大量的数学计算,
即从数据库中取出很小部分的数据,却要对这小部分数据进行较大的计算量,然后把计算结果再存回数据库,
之前一直在使用silverlight还是wpf而徘徊,前者部署方便但本地资源应用不足,后者数据库和数学算法实现较方便但部署特别是framework部署相当麻烦。
现在感觉不如只把silverlight和wpf做为用户端的前台显示,
对数据的数学计算算法可以做成dll文件,放在服务端直接调用,
再采用WCF与前端的silverlight和wpf通信。
这样子有几个好处:
1、前台显示不再有过多的设计压力,不管转到哪种技术都不会太困难,仅仅用于显示,本来二种技术就是互通的,这样子我甚至可以直接开发出silverlight和wpf二个版本的前台显示,至于使用桌面端还是浏览器端可以由用户自己选择。
2、将我的数据算法放在dll文件中,可以在服务端执行这些算法,也可以在用户端实现计算,如果想减轻服务端的压力,则可以由用户端来计算,二个位置转换方便。比如silverlight的运行效率有些低,且不能引用c++版本的dll,那么就在服务器上实现算法,而对于wpf版客户端,则可以直接在本地实现运算,以减小服务器的压力。
但由于对WCF技术不熟悉,存在一些疑问,请大家给解答一下:
1、在服务端访问数据库,那WCF是否可以直接访问数据库呢?还是必须通过实体框架实现?没有用WCF实现过,不知道该怎么整?
2、如何在设计之初就考虑到SQLServer和Oracle二各数据库的双引擎,以便在部署时不管采用哪种数据库都可以轻松的实现?
3、如何在服务端引用编译成dll的数学算法,是在WCF的函数中直接调用,还是通过其他方法实现呢?
4、对于用Matlab等数学计算软件生成的C++版本的dll,是否可以在服务端成功调用?我只知道在wpf中可以调用。
5、域的问题,服务端访问数据库,是否需要考虑这个问题?比如说我把数据库和WCF宿主不放在一块呢?我只知道silverlight需要考虑。
6、是否给出一个类似采用WCF实现的数据库访问实例,好参考一下?越简单越好。
7、我这样的构想不知是否可行?或者有什么不足之处或者建议,希望能指导一二。
[解决办法]
WCF带来的是分布式N层应用程序结构,好处就是分布式、N层。
WCF访问数据库,和ASP.NET、Windows应用程序访问数据库是基本相同的:
如果是使用 ADO.NET 访问数据库,那是完全相同的,并且 ADO.NET 完全支持 Oracle,
ADO.NET 是使用了抽象工厂模式,只要SQL在转换时没有问题,完全支持从 SqlClient 转换成 OracleClient;
如果是使用实体访问数据库,目前有 LINQ to SQL 和 ADO.NET Entity Framework 两种,
那就有一些重要的不同。因为客户端对于WCF而言是“离线”的,作为参数传递给WCF方法的实体Entity
也都是“离线Detached”的,要把Entity重新Attach后才能用于访问数据库。对于Oracle的支持,
目前 LINQ to SQL 不支持Oracle(实际上LINQ to SQL是过渡产品,现在不应当继续使用了),
ADO.NET Entity Framework 官方支持 Oracle 的ODP.NET beta要等到今年底才推出。
至于WCF中调用dll,这是和ASP.NET完全相同的。
WCF不存在像Silverlight那样的“跨域访问”,“跨域访问”是Silverlight和Flash应用程序本身
的要求,不是WCF、WebService的要求。
[解决办法]
WCF RIA Services 只是用于 Silverlight 上的吧,宗旨是把 N层 模拟为 2层,或者说模拟为 Windows 应用程序。
WCF RIA Services + ADO.NET Entity Framework 与 WCF + ADO.NET Entity Framework 还是相差很多的,
关键就在于前者能把 N层变为2层,而后者始终是N层的。