考虑这样一个背景:A系统有一张人事表,B系统也有一张人事表,且B中有一些A中没有的人员属性。如果A需要引用这些数据,该如何处理呢?
实际上,通过View,WebService,数据同步,数据直接访问,都可以达到这个目的。但是如果A作为一个中心系统,还需要访问C,D,E…等系统所特有的数据,该如何处理呢?比较好的办法是做一个通用的外部数据源管理模块,通过简单的设置和公共方法,达到方便一致取用这些数据的目的。
图一 SystemA可以通过emp_id关联到其他系统的人事数据
实现方式如下:
1. 首先做这个数据串联有个基础,必须存在一个Global ID,如上图的emp_id等。
2. 定义全局的数据源,设定服务器路径,账号密码等。
数据源常用的类型有Oracle,sqlServer,MysqL,其它的数据库类型可以使用DSN。
3. 通过引用Global ID作为sql中的参数来定义一系列扩展属性。如下
数据源:Oracle ERP
扩展属性:
职位: select position from user_list where id=’@global_id’
入职日:select duty_onfrom user_list where id=’@global_id’
…
4. 在设计上,采用工厂模式。IExtDatasource接口定义了3个方法。
IsValid - 验证数据源能否正确链接
TryGetData - 验证定义的扩展属性sql是否正确。
GetData - 根据实际参数值获取数据
工厂类实现:
因为WebService和一般数据库数据源所需参数不同,因此参数类使用了泛型
public static class DataSourceFactory { public static IExtDataSource Create<T>(DataSourceType dataSourceType,T context) { switch (dataSourceType) { case DataSourceType.sqlServer: return new sqlServerDataSource(context as DatabaseDataSourceInfo); case DataSourceType.Oracle: return new OracleDataSource(context as DatabaseDataSourceInfo); case DataSourceType.DSN: return new DSNDataSource(context as DatabaseDataSourceInfo); case DataSourceType.WebService: return new WSDataSource(context as WSDataSourceInfo); default: throw new NotImplementedException(); } }
调用示例:
IExtDataSource dataSource= DataSourceFactory.Create<DatabaseDataSourceInfo>(DataSourceType.Oracle,new DatabaseDataSourceInfo() { ServerName = "",DatabaseName = "",UserName = "",Password = "" }); dataSource.ConnectionString= connectionString; Dictionary<string,string> dic = new Dictionary<string,string>(); dic.Add("sql",strsql); DataSetds = dataSource.GetData(dic);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。