應(yīng)用場景
做過開發(fā)的會遇到過這樣一個情景:
1、寫了很多代碼做了一個系統(tǒng);
2、后來又要做一個類似系統(tǒng),也有了設(shè)計模式概念,就把第一個系統(tǒng)的代碼抽調(diào)出來,封裝成公用模塊或類庫,供第二個系統(tǒng)使用;
3、又有幾個類似的系統(tǒng)要做,為了減少工作效率,提煉出自己的一個框架。
說起這個,就繞回到第一節(jié)提到過地圖系統(tǒng)架構(gòu)問題,在這里主要就是地圖服務(wù)api的概念??梢韵胂笠幌?,本來做的GIS系統(tǒng)只支持桌面方式,突然說要做出WebGiS,是不是要重新開發(fā)?沒必要,我們只需做一個共有的地圖服務(wù)接口供調(diào)用,無論是給桌面程序還是瀏覽器,都可以獲得一致的效果,這也就是從B/S和C/S轉(zhuǎn)向B/S/S和C/S/S概念,中間的S就是Application Server,我們把服務(wù)api部署在這里,基于此,我們又可以做一個DEMO。
DEMO
1、在此,借用一下WCF,創(chuàng)建控制臺程序,構(gòu)建解決方案如圖,由于只是簡單演示,具體細節(jié)先不做深究:
IDomain.cs、DomainService.cs、clentaccesspolicy.xml是為了實現(xiàn)跨域,Site是數(shù)據(jù)庫里的基站信息model,ISiteService和SiteService為模擬的地圖查詢服務(wù),具體代碼為:
IDomain.cs [WebGet(UriTemplate = "ClientAccessPolicy.xml")] Message ProvidePolicyFile();
ISiteService.cs
public interface ISiteService
Site.cs public string GID { get; set; } public string SiteName { get; set; } public string Geom { get; set; }
DomainService.cs public class DomainService : IDomain public System.ServiceModel.Channels.Message ProvidePolicyFile() MemoryStream ms = new MemoryStream(); using (FileStream fs = File.OpenRead(@"clientaccesspolicy.xml")) int length = (int)fs.Length; byte[] data = new byte[length]; fs.Read(data, 0, length); ms = new MemoryStream(data); XmlReader reader = XmlReader.Create(ms); Message result = Message.CreateMessage(MessageVersion.None, "", reader);
SiteService.cs public class SiteService:ISiteService private DataSet ds = new DataSet(); private DataTable dt = new DataTable(); public List<Site> GetSites() List<Site> source = new List<Site>(); string connstring = String.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};", "localhost", "5432", "postgres", "sa", "postgis20"); NpgsqlConnection conn = new NpgsqlConnection(connstring); string sql = "SELECT a.* FROM public.cellcover_region as a, site_font_point as b where b.gid=1 and ST_Within(b.geom,a.geom)"; NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn); int count = dt.Rows.Count; for (int i = 0; i < count; i++) SiteName = dr[1].ToString(),
Program.cs static void Main(string[] args) ServiceHost host = new ServiceHost(typeof(SiteService)); ServiceHost crossDomainserviceHost = new ServiceHost(typeof(DomainService)); Console.WriteLine("服務(wù)已經(jīng)啟動,按任意鍵終止..."); crossDomainserviceHost.Opened += delegate Console.WriteLine("跨域服務(wù)已經(jīng)啟動,按任意鍵終止..."); crossDomainserviceHost.Open(); crossDomainserviceHost.Close(); crossDomainserviceHost.Abort();
編譯運行,效果如圖,表示服務(wù)正常啟動:
下面兩點在后續(xù)節(jié)中再做詳細補充:
2、把上節(jié)做的silverlight客戶端,添加該WCF服務(wù),在交互過程中(如點擊圖元)調(diào)用服務(wù)方法,完成數(shù)據(jù)展現(xiàn)
3、wpf做地圖客戶端,添加該WCF服務(wù),在交互過程中調(diào)用服務(wù),完成地圖展現(xiàn)
|