一个分布式应用的常见的设计问题
2007-08-15 13:00
423 查看
注: 现在回头再来看看这个牢骚贴子,发现很多地方说的不当,没有将remoting和wcf 区别来说, wcf 通常需要确定的类型,因为它需要soap串行化,而remoting ,并不需要. 这里所讲的方式,其实是适合于remoting 而非wcf . 这个例子可以看成是如何 减少remoting service的发布和减少层间调用的例子.
分布式应用总有这样那样的限制,比方说不能使用范型方法,确切的说
IList<TEntity> FindAll(); 这样的方法签名是不支持的,但 IList<Customer> FindAll是支持的
c# 3.0的express tree 也不能作为参数传递,如此等等
通常,向服务器发起一个请求,然后得到结果,这个过程,一般就是先抽象接口和方法,然后实现,最后通过remoting,webservice或是wcf之类的暴露它
通常,做例子这个过程会简单,但实际应用中会有大量的接口和实现类,比方说一般中型的应用都是100个以上的数据表,于是乎,这个过程变得相当的繁琐
要节省接口和实现类 的数量,大概唯一的方法就是弱类型化,比方说 ,这样的FinAll方法签名
IList FindAll(string typename);
可以代替上百个强类型的方法签名
在设计时,通常这种问题需要架构师来做决定,该如何处理。比方说为了减少接口数量,定义一个ServiceDispatcher接口和实现 ,这段代码是随便打的,主要用于说明问题
public interface IServiceDispatcher{
object Call(string path,object context);
}
public class ServiceDispatcher : IServiceDispatcher{
public object Call(string path,object context){
string[] s= path.Split('/');
//从容器获取服务类
object service= ContextRegistry.GetContext()[s[0]];
//用reflection调用方法
MethodInfo m=service.GetType().GetMethod(s[1],BindingFlags.Public | BindingFlags.IgnoreCase);
return m.Invoke(service,new object[]{context});
}
// 实现对应的服务,略
当客户端调用时可以使用这样的方式
IList<Customer> customers=(IList<Customer>)ServiceDispatcher.Call("customer/findall",null);
这种方式部署上有优势,只需要部署一个类,同时,一开始,你也无需特别的创建接口
但缺点也是很明显的,就是弱类型,作为开发者,要了解调用格式,输入,输出参数必须遵循分布式应用的规范,比方说在wcf中,需要使用DataContract和DataMember来标记参数中的业务类
此文的主要目的是想和大家探讨一下,在分布式应用中,如何减少客户端和服务端的交互部分的编码,不知道大家有没有什么特别的做法。
分布式应用总有这样那样的限制,比方说不能使用范型方法,确切的说
IList<TEntity> FindAll(); 这样的方法签名是不支持的,但 IList<Customer> FindAll是支持的
c# 3.0的express tree 也不能作为参数传递,如此等等
通常,向服务器发起一个请求,然后得到结果,这个过程,一般就是先抽象接口和方法,然后实现,最后通过remoting,webservice或是wcf之类的暴露它
通常,做例子这个过程会简单,但实际应用中会有大量的接口和实现类,比方说一般中型的应用都是100个以上的数据表,于是乎,这个过程变得相当的繁琐
要节省接口和实现类 的数量,大概唯一的方法就是弱类型化,比方说 ,这样的FinAll方法签名
IList FindAll(string typename);
可以代替上百个强类型的方法签名
在设计时,通常这种问题需要架构师来做决定,该如何处理。比方说为了减少接口数量,定义一个ServiceDispatcher接口和实现 ,这段代码是随便打的,主要用于说明问题
public interface IServiceDispatcher{
object Call(string path,object context);
}
public class ServiceDispatcher : IServiceDispatcher{
public object Call(string path,object context){
string[] s= path.Split('/');
//从容器获取服务类
object service= ContextRegistry.GetContext()[s[0]];
//用reflection调用方法
MethodInfo m=service.GetType().GetMethod(s[1],BindingFlags.Public | BindingFlags.IgnoreCase);
return m.Invoke(service,new object[]{context});
}
// 实现对应的服务,略
当客户端调用时可以使用这样的方式
IList<Customer> customers=(IList<Customer>)ServiceDispatcher.Call("customer/findall",null);
这种方式部署上有优势,只需要部署一个类,同时,一开始,你也无需特别的创建接口
但缺点也是很明显的,就是弱类型,作为开发者,要了解调用格式,输入,输出参数必须遵循分布式应用的规范,比方说在wcf中,需要使用DataContract和DataMember来标记参数中的业务类
此文的主要目的是想和大家探讨一下,在分布式应用中,如何减少客户端和服务端的交互部分的编码,不知道大家有没有什么特别的做法。
相关文章推荐
- 分布式系统开发常见问题-1. session的复制与共享 2. 分布式缓存的设计
- 简易计算器设计中的一个数据结构问题——Ada应用实例之二
- 抢购是如今很常见的一个应用场景,主要需要解决的问题
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
- 分布式系统开发常见问题-1. session的复制与共享 2. 分布式缓存的设计
- 推荐一个 SQL2005 应用常见问题解答网站
- 今日随想——关于企业级应用中分布式架构设计中系统通讯问题
- 分布式系统开发常见问题-1. session的复制与共享 2. 分布式缓存的设计
- [导入]数据库应用系统设计面临的常见的大的方面的问题?
- Windows 8 商店应用开发设计十大常见问题(一)
- 分布式设计常见问题及解决方案
- 分布式系统开发常见问题-1. session的复制与共享 2. 分布式缓存的设计
- weblogic 的应用 常见问题处理 db2 链接不上(转载)
- 设计一个移动应用的本地缓存机制
- Asp.net中如何处理一个站点不同Web应用通用Session的问题
- 并发设计中的应用分发问题算法
- SQL Server 2005 数据转换服务的常见设计问题
- LINQ to SQL 基于属性的映射 一个常见问题
- 【U3D日记-2016年9月2日】设计模式解决工作问题的一个实例